Android的WebView中js与java代码相互调用

现在越来越多的的项目中会采用webview的形式的展示自己的页面,通过这种形式的最大优点是展示的内容的可控性非常强,服务器可以通过更新服务端html文件来展示最新的内容。有些复杂html页面不单单是展示内容,可能还会有一些按钮,点击按钮后会跳转到android的本地页面,这个时候就需要通过js来调用android的本地代码了。核心代码如下:

一、JavaScript调用Java代码

[java]  view plain copy print ?
  1. WebView mMainWV = (WebView) findViewById(R.id.wv_main);  
  2. WebSettings settings = mMainWV.getSettings();  
  3. settings.setJavaScriptEnabled(true);  
  4. mMainWV.addJavascriptInterface(new JavaScriptOnClick(),"flag");//注册js中响应事件的对象  
  5. mMainWV.loadUrl("file:///android_asset/test.html");  
上述代码为webview的初始化:

1.setJavaScriptEnabled(true)是必须要添加的,目的是为了webview允许执行js的事件。

2.addJavascriptInterface(new JavaScriptOnClick(),"flag")中的JavaScriptOnClick是一个自定的类,响应js的事件全部定义在这个类当中;“flag”是一个标记符,用来与js中响应的事件绑定的。

3.loadUrl("file:///android_asset/test.html")表示用webview加载assets根目录下的test.html文件

[java]  view plain copy print ?
  1. class JavaScriptOnClick{  
  2.     public JavaScriptOnClick() {  
  3.     }  
  4.   
  5.     @JavascriptInterface  
  6.     public void print(int num){  
  7.         System.out.println("num: " + num);  
  8.     }  
  9. }  
上述代码自定义的JavaScriptOnClick类:

1.print(int num)是在js中要调用的方法,可以随便定义的,只要能与js中的响应事件对应上就可以了;

2.该类中所有定义的方法必须加上@JavascriptInterface,否则无法被js识别

[html]  view plain copy print ?
  1. <html lang="en">  
  2. <head>  
  3.     <meta charset="UTF-8">  
  4.     <title>Title</title>  
  5. </head>  
  6. <body>  
  7.   
  8. <p id="my-p" onclick="window.flag.print(99)">hello-world</p>  
  9.   
  10. </body>  
  11. </html>  
上述代码为test.html的代码:

1.οnclick="window.flag.print(99)",js调用java代码的响应事件必须写在onclick中;解释下window.flag.print(99),这种写法是一种规定的格式,第一个参数window是固定的,第二个参数flag是自定义的标记符要与java中的addJavascriptInterface声明的标记符对应,第三个参数print(99)是你要调用的方法的名字,该方法是必须要定义在addJavascriptInterface声明的类中;

二、Java调用JavaScript代码

这个就比较简单了,首先要在html代码中写一个你需要调用的js方法块

[html]  view plain copy print ?
  1. <script language="javascript">  
  2.         function callJS() {  
  3.             document.getElementById("my-p").innerHTML="java调用了js";  
  4.         }  
  5. </script>  
上述代码中声明了一个js方法名称为callJS,该方法的作用是修改一个p标签的内容

[java]  view plain copy print ?
  1. findViewById(R.id.btn_call_js).setOnClickListener(new View.OnClickListener() {  
  2.     @Override  
  3.     public void onClick(View v) {  
  4.         mMainWV.loadUrl("javascript:callJS()");  
  5.     }  
  6. });  
上述代码为测试java调用js的代码,为了方便测试,我通过一个button的点击事件来调用js代码。基本格式就如上,通过webview的loadurl方法调用js,”javascript“为固定前缀,”callJS“为js中定义的方法名字。

三、关于WebView中跳转url时,是打开外部浏览器还是通过内部的WebView跳转的控制

[java]  view plain copy print ?
  1. mMainWV.setWebViewClient(new WebViewClient(){  
  2.     @Override  
  3.     public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  4.         if(url != null){  
  5.             if(isInWebView) {//webivew内部跳转  
  6.                 view.loadUrl(url);  
  7.             }else{//打开外部浏览器跳转  
  8.                 Intent intent = new Intent(Intent.ACTION_VIEW);  
  9.                 intent.setData(Uri.parse(url));  
  10.                 startActivity(intent);  
  11.             }  
  12.         }  
  13.         return true;  
  14.     }  
  15. });  

上述代码已经写了跳转的两种方式了(见注释)。shouldOverrideUrlLoading的作用就是为了拦截跳转url的(href),他有一个返回值,boolean类型的。true:表示webview默认不做任何处理,完全根据return true之前的代码来处理;false表示url在webview内部执行。

谢谢大家!!!祝大家新年快乐!!!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值