这段时间很多小伙伴问我关于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”,布局如下图

Android与js交互 在window上挂载全局 android webview与js交互方式_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()");
            }
        });