使用webview时,JS与Android互相传值的方法

在Android项目中,有时候整个页面是个webview,用来加载我们制作好的网页。
那么时常会有网页和app进行交互的需求。

首先,webview需要作如下配置,下面几行都是必要的,还有其他配置未列出,可参考:
Android webview里加载显示网页,显示进度,点击网页链接跳转到app页面

//支持JavaScript
WebSettings setting = webview.getSettings();
setting.setJavaScriptEnabled(true);

写好了上面的基础配置,再实现相互调用:

一. JS如何调用Android的方法:
需求一: 如果需要我们点击网页上的按钮后,关闭当前页面回到app,怎么实现呢?

首先在加载webview的activity里定义一个内部类,像下面这样:

    public class WebAppInterface {
        @JavascriptInterface
        public void backToApp() {
            finish();
        }
    }

其中@JavascriptInterface标签表示这个方法是供JS调用的。
然后给webview添加这个JS接口,并且设置一个接口名,比如“Android”,像下面这样

//给web提供调用接口
webview.addJavascriptInterface(new WebAppInterface(), "Android");
webview.getSettings().setDomStorageEnabled(true);

然后就可以在JS中调用如下:

<input type="button" value="close" onClick="window.Android.backToApp()" />

这样,就实现了点击网页按钮销毁当前页面的功能。

**需求二:**如果要实现JS与Android相互传值,怎么实现呢?
修改WebAppInterface 这个内部类,加上交互的get和set方法:

    public class WebAppInterface {
        @JavascriptInterface
        public void backToApp() {
            finish();
        }
        
        @JavascriptInterface
        public String getString() {
            return mStr;
        }

        @JavascriptInterface
        public void setString(String str) {
            mStr = str;
        }
    }

然后在JS代码中,合适的位置,调用window.Android.getString()或者window.Android.setString(xxx)即可。

注意:字符串传递没问题,但是试了一下布尔值,貌似不能传递。。。

上面讲了JS如何调用Android方法,下面看下

二. Android如何调用JS的函数:

  1. 如果不需要返回值,直接这样调用即可:
    webview.loadUrl(“javascript:jsMethodName()”); //jsMethodName就是JS代码中定义的函数名。
    如果需要传参数,像下面这样:
    webview.loadUrl(“javascript:jsMethodName(’”+params+"’)"); //jsMethodName就是JS代码中定义的函数名,params可以是json字符串。注意这里params被单引号包裹,是为了传递字符串类型的参数。

  2. 如果需要返回值,需要这样调用:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {	//sdk>19才有
    //String jsMethodName = "XXX()"; //不需要参数的JS函数名
    String jsMethodName = "XXX('" + p + "')"; //需要参数的JS函数名
    webview.evaluateJavascript(jsMethodName, new ValueCallback<String>() {
        @Override
        public void onReceiveValue(String responseJson) { //这里传入的参数就是JS函数的返回值                 
            LogUtil.d("JSMethod", "调用js返回值:"+ responseJson);
        }
    });
} else {
	//SDK <= 19,暂时没找到方案
}

注意:如果JS代码中XXX()函数返回的是字符串类型,则onReceiveValue(String responseJson)方法传入的responseJson就是这个字符串,而且是带双引号的json字符串。如果当前网页代码里找不到XXX()这个函数,则responseJson就为“null”,注意是“null”这个字符串,而不是null。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值