WebView和JS相互通信
WebView调用JS函数
通用方式,不能获取JS函数的返回值:
webView.loadUrl("javascript:alert('hello world');");
Android 4.4.及以上系统的WebView专用方式,可以获取JS函数的返回值:
webView.evaluateJavascript("javascript:add(2,3)", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { Log.i("tag",value); } });
JS调用Native函数
首先,需要通过WebView提供的函数注册JS对象
public class AndroidJSInterface { @JavascriptInterface //注意,所有可被JS调用的函数,一定要加上@JavascriptInterface,否则JS无法调用 public String handler(String action, String value){ return ""; } }
webView.addJavascriptInterface(new AndroidJSInterface(),"Android");
JS调用Native提供的handler函数的代码示例如下:
window.Android.handler("sayHello","hello world");
其中Android对象就是我们通过addJavascriptInterface()函数注册的JS对象
JS调用Native对象,支持有返回值的函数和没有返回值的函数
JS调用Native函数的时候,建议通过JSON数据来传值,不然的话,可能会出现调用失败的情况
比如:
window.Android.handler("sayHello",JSON.stringify(obj));
当JS不再使用Native对象时,可以把Native对象注销掉
webView.removeJavascriptInterface("Android");
WebView加载URL和HTML字符串的方法
WebView加载指定的url
不带http header
webView.loadUrl(mUrl);
带http header
Map<String,String> httpHeaders=new LinkedHashMap<>(); httpHeaders.put("userName","kgdwbb"); webView.loadUrl(mUrl,httpHeaders);
WebView加载html片段
webView.loadData("<h1>title</h1>","text/html; charset=utf-8", null);
这里有一个问题,就是当webView.loadData()函数第三个参数传入页面的字符编码的时候,不起作用,可能是这个函数本身的问题
我的解决方法就是在第二个参数里面传入页面的字符编码,比如charset=utf-8,如果不显示指定页面的字符编码,在显示中文的时候可能会出现乱码的情况
WebView 发送POST请求
代码示例:
webView.loadUrl(mUrl);