安卓与JS互调之android webview addJavascriptInterface 的方法不能调用

以前一直觉着用HTML5Android app是一件很鸡肋的事(勿喷,请恕小的见识少微笑)。

后来又发现很多大公司做的app中都或多或少的使用了html元素,比如微信、qq之类。

最近在网上闲逛发现一个IDE可以使用纯html js css设计app并发布到多个平台,并且更牛的是可以直接使用它提供的js api调用各种系统原生的api。一时心动下载研究。后来发现也并不是想象中多么神奇的事情。

于是乎自己动手;想用html的方式来做界面设计,用js调用一些常用的系统api。比如说http请求、弹窗提示等等。

说搞就搞,由于自己以前没有怎么接触过webview,先做个demo测试测试。

所有代码准备就绪。结果一运行点击按钮居然什么反应都没有。

就十几行代码;各种检查,各种看不出问题所在。

又把以前做的类似的webview的demo导入eclipse运行。居然没问题。。。。。。

把两个demo代码反复比较,都没有找到问题。

结果最终发现居然是我 target api 是4.2的以前的api是4.0的。。。。

4.2及以上api与JavaScript交互时需要在方法上添加注解@JavascriptInterface 。

好了。下面吧代码摆出来做个记录:


我们需要些的就三个文件画红圈的文件。

MainActivity.Java

  1. package com.example.testwebview;  
  2.   
  3. import android.os.Bundle;  
  4. import android.annotation.SuppressLint;  
  5. import android.app.Activity;  
  6. import android.webkit.JavascriptInterface;  
  7. import android.webkit.WebView;  
  8. import android.widget.Toast;  
  9.   
  10. public class MainActivity extends Activity {  
  11.   
  12.     private WebView webView;  
  13.     @SuppressLint("SetJavaScriptEnabled")  
  14.     @Override  
  15.     protected void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.webview);  
  18.         webView = (WebView)this.findViewById(R.id.webview);  
  19.         //启用javascript  
  20.         webView.getSettings().setJavaScriptEnabled(true);  
  21.         //加载本地html文件  
  22.         webView.loadUrl("file:///android_asset/test.html");  
  23.         /** 
  24.          * 添加javascriptInterface 
  25.          * 第一个参数:这里需要一个与js映射的java对象 
  26.          * 第二个参数:该java对象被映射为js对象后在js里面的对象名,在js中要调用该对象的方法就是通过这个来调用 
  27.          */  
  28.         webView.addJavascriptInterface(new JSInterface(), "jsi");  
  29.     }  
  30.       
  31.     @SuppressWarnings("unused")  
  32.     private final class JSInterface{  
  33.         /** 
  34.          * 注意这里的@JavascriptInterface注解, target是4.2以上都需要添加这个注解,否则无法调用 
  35.          * @param text 
  36.          */  
  37.         @JavascriptInterface  
  38.         public void showToast(String text){  
  39.             Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();  
  40.         }  
  41.         @JavascriptInterface  
  42.         public void showJsText(String text){  
  43.             webView.loadUrl("javascript:jsText('"+text+"')");  
  44.         }  
  45.     }  
  46.   
  47. }  
test.html

[html]  view plain  copy
  1. <html>  
  2.     <head>  
  3.         <meta http-equiv="content-type" content="text/html;charset=utf-8">  
  4.         <title></title>  
  5.         <script type="text/javascript">  
  6.         //这个function是需要被java调用的  
  7.         function jsText(text){  
  8.             document.getElementById('ttt').innerHTML=text;  
  9.         }  
  10.         </script>  
  11.     </head>  
  12.     <body>  
  13.         <input type="button" onclick="jsi.showToast('测试js调用系统api')" value="调用系统api Toast"/><br/>  
  14.         <input type="button" onclick="jsi.showJsText('测试java回调js')" value="让java方法回调html中的js方法"/>  
  15.         <div id="ttt"></div>  
  16.     </body>  
  17. </html>  
webview.xml

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <WebView xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:id="@+id/webview" >  
  6.       
  7.   
  8. </WebView>  
关于AndroidManifest.xml中的权限问题。我看了很多帖子都说要加internet访问权限。

其实经过我测试。如果你的应用中没有需要访问网络的地方、并且你的所有html js css都是放在assets目录下没有从网络上读取文件,是可以不加这个权限的。

下面是我的androidmanifest文件


到这里我的测试是完全通过的。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值