安卓实现webview 与js交互

来源:互联网 发布:淘宝无缝拼接 编辑:程序博客网 时间:2024/04/30 08:54

http://blog.csdn.net/chenfeng0104/article/details/7023448


这篇文章讲了一些WevView的使用方法,在项目中,常常会使用到,尤其是需要与JS交互。

效果图



点击“调用alert”按钮,在Android中捕获JS alert,并用Android组件(AlertDialog)替换


点击“调用java方法”按钮,在JS中调用并传递参数到Java中的方法



点击“调JS方法”按钮(这个按钮不是html元素,而是android元素),从Java端调用html中的JS方法,并传递参数到JS方法中。



完整代码

在assets目录下创建一个html文件来模拟WebView访问的内容


编辑js_interact_demo.html内容如下

[html] view plaincopy
  1. <html>  
  2. <head>  
  3.   <title>JS交互</title>  
  4.   <meta http-equiv="content-type" content="text/html; charset=utf-8"/>  
  5.   <script type="text/javascript">  
  6.     function invokedByJava(param) {  
  7.         document.getElementById("content").innerHTML = "Java has invoked JS function and returnd the data:"+param;  
  8.     }  
  9.   </script>  
  10. </head>  
  11. <body>  
  12.   <p id="content"></p>  
  13.   <p>  
  14.   <input type="button" value="调用Java方法" onclick="window.stub.jsMethod('来至JS的参数');" />  
  15.   <input type="button" value="调用alert" onclick="alert('hello')" />  
  16.   </p>  
  17. </body>  
  18. </html>  


在res/layout目录下创建web_view.xml布局文件,内容如下

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   android:orientation="vertical"  
  5.   android:layout_width="match_parent"  
  6.   android:layout_height="match_parent">  
  7.     <Button android:id="@+id/web_view_invoke_js"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="调JS方法"/>  
  11.     <LinearLayout android:layout_width="fill_parent"  
  12.         android:layout_height="wrap_content">  
  13.         <EditText android:id="@+id/web_view_text"  
  14.             android:layout_width="wrap_content"  
  15.             android:layout_height="wrap_content"  
  16.             android:layout_weight="1"/>  
  17.         <Button android:id="@+id/web_view_search"  
  18.             android:layout_width="wrap_content"  
  19.             android:layout_height="wrap_content"  
  20.             android:text="浏览"/>  
  21.     </LinearLayout>  
  22.     <WebView android:id="@+id/web_view"  
  23.         android:layout_width="fill_parent"  
  24.         android:layout_height="fill_parent" />  
  25. </LinearLayout>  

创建名为WebViewDemo的Activity文件

[java] view plaincopy
  1. public class WebViewDemo extends Activity {  
  2.     private WebView mWebView;  
  3.   
  4.     @Override  
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.web_view);  
  8.   
  9.         findViewById(R.id.web_view_invoke_js).setOnClickListener(new OnClickListener() {  
  10.             @Override  
  11.             public void onClick(View v) {  
  12.                 //调用JS方法,并传递参数  
  13.                 mWebView.loadUrl("javascript:invokedByJava('java_data')");  
  14.             }  
  15.         });  
  16.   
  17.         mWebView = (WebView)findViewById(R.id.web_view);  
  18.         mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);  
  19.         mWebView.getSettings().setBuiltInZoomControls(true);  
  20.         mWebView.getSettings().setJavaScriptEnabled(true);  
  21.   
  22.         /*  
  23.           WebView默认用系统自带浏览器处理页面跳转。 
  24.                             为了让页面跳转在当前WebView中进行,重写WebViewClient。 
  25.                             但是按BACK键时,不会返回跳转前的页面,而是退出本Activity。重写onKeyDown()方法来解决此问题。 
  26.          */  
  27.         mWebView.setWebViewClient(new WebViewClient() {  
  28.             @Override  
  29.             public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  30.                 view.loadUrl(url);//使用当前WebView处理跳转  
  31.                 return true;//true表示此事件在此处被处理,不需要再广播  
  32.             }  
  33.             @Override  
  34.             public void onPageStarted(WebView view, String url, Bitmap favicon) {  
  35.                 //有页面跳转时被回调  
  36.             }  
  37.             @Override  
  38.             public void onPageFinished(WebView view, String url) {  
  39.                 //页面跳转结束后被回调  
  40.             }  
  41.             @Override  
  42.             public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {  
  43.                 Toast.makeText(WebViewDemo.this"Oh no! " + description, Toast.LENGTH_SHORT).show();  
  44.             }  
  45.         });  
  46.   
  47.         /* 
  48.                             当WebView内容影响UI时调用WebChromeClient的方法 
  49.          */  
  50.         mWebView.setWebChromeClient(new WebChromeClient() {  
  51.             /** 
  52.              * 处理JavaScript Alert事件 
  53.              */  
  54.             @Override  
  55.             public boolean onJsAlert(WebView view, String url,  
  56.                     String message, final JsResult result) {  
  57.                 //用Android组件替换  
  58.                 new AlertDialog.Builder(WebViewDemo.this)  
  59.                     .setTitle("JS提示")  
  60.                     .setMessage(message)  
  61.                     .setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {  
  62.                         public void onClick(DialogInterface dialog, int which) {  
  63.                             result.confirm();  
  64.                         }  
  65.                     })  
  66.                     .setCancelable(false)  
  67.                     .create().show();  
  68.                 return true;  
  69.             }  
  70.         });  
  71.   
  72.         /* 
  73.                           绑定Java对象到WebView,这样可以让JS与Java通信(JS访问Java方法) 
  74.                           第一个参数是自定义类对象,映射成JS对象 
  75.                           第二个参数是第一个参数的JS别名 
  76.                           调用示例: 
  77.             mWebView.loadUrl("javascript:window.stub.jsMethod('param')"); 
  78.          */  
  79.         mWebView.addJavascriptInterface(new JsToJava(), "stub");  
  80.           
  81.         final EditText mEditText = (EditText)findViewById(R.id.web_view_text);  
  82.   
  83.         findViewById(R.id.web_view_search).setOnClickListener(new OnClickListener() {  
  84.             @Override  
  85.             public void onClick(View view) {  
  86.                 String url = mEditText.getText().toString();  
  87.                 if (url == null || "".equals(url)) {  
  88.                     Toast.makeText(WebViewDemo.this"请输入URL", Toast.LENGTH_SHORT).show();  
  89.                 } else {  
  90.                     if (!url.startsWith("http:") && !url.startsWith("file:")) {  
  91.                         url = "http://" + url;  
  92.                     }  
  93.                     mWebView.loadUrl(url);  
  94.                 }  
  95.             }  
  96.         });  
  97.         //默认页面  
  98.         mWebView.loadUrl("file:///android_asset/js_interact_demo.html");  
  99.     }  
  100.   
  101.     @Override  
  102.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  103.         //处理WebView跳转返回  
  104.         if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {  
  105.             mWebView.goBack();  
  106.             return true;  
  107.         }  
  108.         return super.onKeyDown(keyCode, event);  
  109.     }  
  110.       
  111.     private class JsToJava {  
  112.         public void jsMethod(String paramFromJS) {  
  113.             Log.i("CDH", paramFromJS);  
  114.         }  
  115.     }  
  116. }  

0 0
原创粉丝点击