分享

WebView使用总结(应用函数与JS函数互相调用) 对网页中JS的类似Alert

 quasiceo 2014-09-04
本帖最后由 yukong 于 2011-11-22 19:25 编辑

1.当只用WebView的时候,最先注意的当然是在配置文件中添加访问因特网的权限;
<uses-permission android:name="android.permission.INTERNET" />
2.如果访问的页面中有Javascript,必须设置支持Javascript:

Java代码
  1.    webview.getSettings().setJavaScriptEnabled(true);
  2.   
复制代码
3.如果希望点击链接由自己处理而不是新开Android的系统browser中响应该链接.给WebView添加一个事件监听对象(WebViewClient)并重写其中的一些方法 shouldOverrideUrlLoading对网页中超链接按钮的响应
Java代码
  1. mWebView.setWebViewClient(new WebViewClient() {
  2. /**
  3. * Show in webview not system webview.
  4. */
  5. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  6.     view.loadUrl(url);
  7.     return super.shouldOverrideUrlLoading(view, url);
  8. }
  9. }

复制代码
这样就保证了每次打开的页面都是在WebView实例中显示运行的;

4.在显示WebView时,点击手机Back时,会完全退出当前Activity,如果想退到历史浏览页面:重写back监听:
Java代码
  1. public boolean onKeyDown(int keyCode, KeyEvent event) {
  2. WebView mWebView = (WebView) findViewById(R.id.browser);
  3. if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
  4.      mWebView.goBack();
  5.      return true;
  6.   }
  7. return super.onKeyDown(keyCode, event);
  8. }

复制代码
5.Android SDK提供了一个schema前缀为"file:///android_asset/".WebView遇到这样的schema,就去当前包中的 assets目录中找内容.如:"file:///android_asset/demo.html"
下面一段代码是对网页中JS的类似Alert()类的函数进行相应的重写响应:
Java代码
import android.view.View;
import android.view.Window;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.JsResult;
import android.webkit.JsPromptResult;
import android.widget.TextView;
import android.widget.EditText;

BrowserJs 是当前Activity类的名字
  1. webView.setWebChromeClient(new WebChromeClient() {
  2.                         public boolean onJsAlert(WebView view, String url, String message,
  3.                                         final JsResult result) {
  4.                                 AlertDialog.Builder b = new AlertDialog.Builder(BrowserJs.this);
  5.                                 b.setTitle("Alert");
  6.                                 b.setMessage(message);
  7.                                 b.setPositiveButton(android.R.string.ok,
  8.                                                 new AlertDialog.OnClickListener() {
  9.                                                         public void onClick(DialogInterface dialog,
  10.                                                                         int which) {
  11.                                                                 result.confirm();
  12.                                                         }
  13.                                                 });
  14.                                 b.setCancelable(false);
  15.                                 b.create();
  16.                                 b.show();
  17.                                 return true;
  18.                         };

  19.                         @Override
  20.                         public boolean onJsConfirm(WebView view, String url,
  21.                                         String message, final JsResult result) {
  22.                                 AlertDialog.Builder b = new AlertDialog.Builder(BrowserJs.this);
  23.                                 b.setTitle("Confirm");
  24.                                 b.setMessage(message);
  25.                                 b.setPositiveButton(android.R.string.ok,
  26.                                                 new AlertDialog.OnClickListener() {
  27.                                                         public void onClick(DialogInterface dialog,
  28.                                                                         int which) {
  29.                                                                 result.confirm();
  30.                                                         }
  31.                                                 });
  32.                                 b.setNegativeButton(android.R.string.cancel,
  33.                                                 new DialogInterface.OnClickListener() {
  34.                                                         public void onClick(DialogInterface dialog,
  35.                                                                         int which) {
  36.                                                                 result.cancel();
  37.                                                         }
  38.                                                 });
  39.                                 b.setCancelable(false);
  40.                                 b.create();
  41.                                 b.show();
  42.                                 return true;
  43.                         };

  44.                         @Override
  45.                         public boolean onJsPrompt(WebView view, String url, String message,
  46.                                         String defaultValue, final JsPromptResult result) {
  47.                                 final LayoutInflater factory = LayoutInflater
  48.                                                 .from(BrowserJs.this);
  49.                                 final View v = factory.inflate(
  50.                                                 R.layout.prompt_dialog, null);
  51.                                 ((TextView) v.findViewById(R.id.prompt_message_text))
  52.                                                 .setText(message);
  53.                                 ((EditText) v.findViewById(R.id.prompt_input_field))
  54.                                                 .setText(defaultValue);

  55.                                 AlertDialog.Builder b = new AlertDialog.Builder(BrowserJs.this);
  56.                                 b.setTitle("Prompt");
  57.                                 b.setView(v);
  58.                                 b.setPositiveButton(android.R.string.ok,
  59.                                                 new AlertDialog.OnClickListener() {
  60.                                                         public void onClick(DialogInterface dialog,
  61.                                                                         int which) {
  62.                                                                 String value = ((EditText) v
  63.                                                                                 .findViewById(R.id.prompt_input_field))
  64.                                                                                 .getText().toString();
  65.                                                                 result.confirm(value);
  66.                                                         }
  67.                                                 });
  68.                                 b.setNegativeButton(android.R.string.cancel,
  69.                                                 new DialogInterface.OnClickListener() {
  70.                                                         public void onClick(DialogInterface dialog,
  71.                                                                         int which) {
  72.                                                                 result.cancel();
  73.                                                         }
  74.                                                 });
  75.                                 b.setOnCancelListener(new DialogInterface.OnCancelListener() {
  76.                                         public void onCancel(DialogInterface dialog) {
  77.                                                 result.cancel();
  78.                                         }
  79.                                 });
  80.                                 b.show();
  81.                                 return true;
  82.                         };

  83.                         public void onProgressChanged(WebView view, int newProgress) {
  84.                                 BrowserJs.this.getWindow().setFeatureInt(
  85.                                                 Window.FEATURE_PROGRESS, newProgress * 100);
  86.                                 super.onProgressChanged(view, newProgress);
  87.                         }

  88.                         public void onReceivedTitle(WebView view, String title) {
  89.                                 BrowserJs.this.setTitle(title);
  90.                                 super.onReceivedTitle(view, title);
  91.                         }
  92.                 });

  93.                 go.setOnClickListener(new OnClickListener() {
  94.                         public void onClick(View view) {
  95.                                 String url = text.getText().toString();
  96.                                 webView.loadUrl(url);
  97.                         }
  98.                 });
  99.                 webView.loadUrl("file:///android_asset/index.html");

复制代码
在上述代码中,用到的prompt_dialog.xml:
Java代码
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas./apk/res/android"
  3.         android:gravity="center_horizontal" android:orientation="vertical"
  4.         android:layout_width="fill_parent" android:layout_height="wrap_content">
  5.         <TextView android:id="@+id/prompt_message_text"
  6.                 android:layout_width="fill_parent" android:layout_height="wrap_content" />
  7.         <EditText android:id="@+id/prompt_input_field"
  8.                 android:layout_width="fill_parent" android:layout_height="wrap_content"
  9.                 android:selectAllOnFocus="true" android:scrollHorizontally="true"
  10.                 android:minWidth="250dp" />
  11. </LinearLayout>

复制代码
还有assets中的Html文件:
Java代码
  1. <html>
  2. <script type="text/javascript">
  3.   function onAlert(){
  4.           alert("This is a alert sample from html");
  5.   }
  6.   function onConfirm(){
  7.           var b=confirm("are you sure to login?");
  8.           alert("your choice is "+b);
  9.   }
  10.   function onPrompt(){
  11.           var b=prompt("please input your password","aaa");
  12.           alert("your input is "+b);
  13.   }
  14. </script>
  15. <pre>
  16. <input type="button" value="alert" onclick="onAlert()"/>
  17. <input type="button" value="confirm" onclick="onConfirm()"/>
  18. <input type="button" value="prompt" onclick="onPrompt()"/>

  19. <a href="http://www.google.com"/>Google</a>
  20. </pre>
  21. </html>

复制代码
接着上篇:
6.通过字符串拼凑的html页面显示:
Java代码
  1. public void simpleJsClick() {
  2.                 WebView webView = (WebView) findViewById(R.id.webview);
  3.                 String html = "<html>"
  4.                                 + "<body>"
  5.                                 + "图书封面<br>"
  6.                                 + "<table width='200' border='1' >"
  7.                                 + "<tr>"
  8.                                 + "<td><a onclick='alert(\"Java Web开发速学宝典\")' > </a></td>"
  9.                                 + "<td><a onclick='alert(\"大象--Thinking in UML\")' > </td>"
  10.                                 + "</tr>"
  11.                                 + "<tr>"
  12.                                 + "<td> </td>"
  13.                                 + "<td> </td>"
  14.                                 + "</tr>" + "</table>" + "</body>" + "</html>";

  15.                 webView.loadDataWithBaseURL(null, html, "text/html", "utf-8", null);
  16.                 webView.getSettings().setJavaScriptEnabled(true);
  17.                 webView.setWebChromeClient(new WebChromeClient());
  18.         }

复制代码
7.在同种分辨率的情况下,屏幕密度不一样的情况下,自动适配页面:
Java代码
  1. DisplayMetrics dm = getResources().getDisplayMetrics();
  2.    int scale = dm.densityDpi;
  3.    if (scale == 240) { //
  4.       webView.getSettings().setDefaultZoom(ZoomDensity.FAR);
  5.     } else if (scale == 160) {
  6.       webView.getSettings().setDefaultZoom(ZoomDensity.MEDIUM);
  7.     } else {
  8.       webView.getSettings().setDefaultZoom(ZoomDensity.CLOSE);
  9. }

复制代码
8.判断加载的页面URL地址是否正确:
Java代码
  1.    if(URLUtil.isNetworkUrl(url)==true)

复制代码
9.设置WebView的一些缩放功能点:
Java代码
  1. webView.getSettings().setJavaScriptEnabled(true);
  2. webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
  3. webView.setHorizontalScrollBarEnabled(false);
  4. webView.getSettings().setSupportZoom(true);
  5. webView.getSettings().setBuiltInZoomControls(true);
  6. webView.setInitialScale(70);
  7. webView.setHorizontalScrollbarOverlay(true);

复制代码
完成java文件:
Java代码
  1. public class MethodMutual extends Activity {

  2.         private WebView mWebView;
  3.         private Handler mHandler = new Handler();
  4.         private static final String LOG_TAG = "WebViewDemo";

  5.         /** Called when the activity is first created. */
  6.         @Override
  7.         public void onCreate(Bundle savedInstanceState) {
  8.                 super.onCreate(savedInstanceState);
  9.                 setContentView(R.layout.main);
  10.                 loadAssetHtml();
  11.         }

  12.         public void loadAssetHtml() {
  13.                 mWebView = (WebView) findViewById(R.id.webview);
  14.                 WebSettings webSettings = mWebView.getSettings();
  15.                 webSettings.setSavePassword(false);
  16.                 webSettings.setSaveFormData(false);
  17.                 webSettings.setJavaScriptEnabled(true);
  18.                 webSettings.setSupportZoom(false);
  19.                 mWebView.setWebChromeClient(new MyWebChromeClient());
  20.                 // 将一个java对象绑定到一个javascript对象中,javascript对象名就是interfaceName,作用域是Global.
  21.                 mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
  22.                 mWebView.loadUrl("file:///android_asset/demo.html");
  23.                 // 通过应用中按钮点击触发JS函数响应
  24.                 Button mCallJS = (Button) findViewById(R.id.mCallJS);
  25.                 mCallJS.setOnClickListener(new OnClickListener() {
  26.                         @Override
  27.                         public void onClick(View v) {
  28.                                 mWebView.loadUrl("javascript:wave()");
  29.                         }
  30.                 });
  31.         }

  32.         private int i = 0;

  33.         final class DemoJavaScriptInterface {
  34.                 DemoJavaScriptInterface() {
  35.                 }
  36.                 /**
  37.                  * This is not called on the UI thread. Post a runnable to invoke
  38.                  * loadUrl on the UI thread.
  39.                  */
  40.                 public void callAndroid() {
  41.                         mHandler.post(new Runnable() {
  42.                                 public void run() {
  43.                                         if (i % 2 == 0) {
  44.                                                 mWebView.loadUrl("javascript:wave()");
  45.                                         } else {
  46.                                                 mWebView.loadUrl("javascript:waveBack()");
  47.                                         }
  48.                                         i++;
  49.                                 }
  50.                         });
  51.                 }
  52.         }

  53.         /**
  54.          * Provides a hook for calling "alert" from javascript. Useful for debugging
  55.          * your javascript.
  56.          */
  57.         final class MyWebChromeClient extends WebChromeClient {
  58.                 @Override
  59.                 public boolean onJsAlert(WebView view, String url, String message,
  60.                                 JsResult result) {
  61.                         Log.d(LOG_TAG, message);
  62.                         result.confirm();
  63.                         return true;
  64.                 }
  65.         }
  66. }

复制代码
main.xml文件:
Java代码
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas./apk/res/android"
  3.         android:orientation="vertical" android:layout_width="fill_parent"
  4.         android:layout_height="fill_parent">
  5.         <Button android:layout_width="wrap_content" android:text="CallJs"
  6.                 android:layout_height="wrap_content" android:id="@+id/mCallJS" />
  7.         <WebView android:id="@+id/webview" android:layout_width="fill_parent"
  8.                 android:layout_height="fill_parent" />
  9. </LinearLayout>

复制代码
demo.html:
Java代码
  1. <html>
  2.         <script language="javascript">
  3.             /* This function is invoked by the activity */
  4.                 function wave() {
  5.                     alert("1");
  6.                         document.getElementById("droid").src="android_waving.png";
  7.                         alert("2");
  8.                 }
  9.                  /* This function is invoked by the activity */
  10.                 function waveBack() {
  11.                     alert("1");
  12.                         document.getElementById("droid").src="android_normal.png";
  13.                         alert("2");
  14.                 }
  15.         </script>
  16.         <body>
  17.             <!-- Calls into the javascript interface for the activity -->
  18.             <a onClick="window.demo.callAndroid()"><div style="width:80px;
  19.                         margin:0px auto;
  20.                         padding:10px;
  21.                         text-align:center;
  22.                         border:2px solid #202020;" >
  23.                                 <br>
  24.                                 Click me!
  25.                 </div></a>
  26.         </body>
  27. </html>

复制代码
还有用到的2张机器人图片:

























    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多