欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-05 20:52:40
...

这段时间很多小伙伴问我关于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通过webview与js交互的方法

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()");
            }
        });