关于Android通过webview与js交互的方法

来源:互联网 发布:linux主目录是什么 编辑:程序博客网 时间:2024/06/05 02:24

这段时间很多小伙伴问我关于android与js交互的相关问题,索性就开一贴与大家交流一下
现在市面上的app大致分为三类,纯原生的、html套壳的、原生与html混编的,前两个就不说了,最后一个原生与html混编势必会用到android与js的数据交互,即webview控件的使用。
现在来看一下方法吧
首先要记得开启网络权限

<uses-permission android:name="android.permission.INTERNET" />

然后使用webview控件

 <Button        android:id="@+id/button"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="传值给html" />    <WebView        android:id="@+id/webview"        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"        tools:layout_editor_absoluteX="8dp"        tools:layout_editor_absoluteY="8dp">    </WebView>

这里面包含的样式根据布局自定义的,你们在使用时不用理会,只要有webview控件就ok
然后在Activity中编写代码:

webView = (WebView) findViewById(R.id.webview);webView.getSettings().setJavaScriptEnabled(true);//开启js使用权限        webView.getSettings().setDefaultTextEncodingName("GBK");//开启中文编码,不过好像不写也没事        webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);//设置网页的滚动条样式,这个样式是不占用屏幕空间webView.setWebChromeClient(new WebChromeClient() {            @Override            public void onProgressChanged(WebView view, int newProgress) {  //监听页面加载进度                if (newProgress == 100) {//页面加载完之后的操作                }                super.onProgressChanged(view, newProgress);            }        });webView.addJavascriptInterface(new AndroidAndJs(WebViewActivity.this),"android2js");//加入交互的接口,AndroidAndJs是自定义的一个类,"android2js"是自定义的类名(在js中使用)        webView.loadUrl("file:///android_asset/test.html");//加载网页

以上代码注释很清晰,需要注意的是,如果加载http的网页,而里面引用了https的超链接文件,比如图片,那么在5.0以上的版本是无法显示图片的,因为5.0以上的版本默认关闭http与https的混合模式,所以,如果有这方面需求的,可以将它开启

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {   //如果当前版本大于5.0时            webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);//开启http与https的混合模式        }

如果无法识别Build.VERSION_CODES.LOLLIPOP,那就将它改成它的常量值“21”。

AndroidAndJs类

新建一个专门用于与js交互的自定义类AndroidAndJs

public class AndroidAndJs {    Context context;    public AndroidAndJs(Context context) {        this.context = context;    }    @JavascriptInterface    public void showMsg(String str) {        Toast.makeText(context,str,Toast.LENGTH_SHORT).show();    }    ç    public String getInfo(){        return "我是从手机原生过来滴~";    }}

有一点要注意的是,需要js调用的方法一定要在方法名上加注解@JavascriptInterface,不然无法执行

HTML页

新建一个html 页,暂且命名为“test.html”,布局如下图
这里写图片描述

js代码

<script type="text/javascript" src="jquery-1.11.2.min.js" ></script><script type="text/javascript">        function set(){            var text=$("#text").val();            window.android2js.showMsg(text);        }        function get(){     $("#content").html(window.android2js.getInfo());        }        function toAndroid(){        $("#content").html("调用了toAndroid()");        }</script>

里面包含三个函数体,set()是将html页文本框的内容传给android,get()是获取android的数据,toAndroid()是预留的android中的按钮调用的方法
android调用js方法为:

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                webView.loadUrl("javascript:toAndroid()");            }        });
原创粉丝点击