Android WebView相关的一些笔记
当Android项目使用WebView去加载网页的时候,很多时候要与JS进行一些交互,所以就会遇到的一些问题, 比如alert在WebView中弹不出来,比如JS调用Native方法报错,假如你也恰好遇到了这些问题,不妨看下我的解决方法, 也许正好能帮上你的忙。
首先Android使用WebView最基本的就是
webView.loadUrl(url);
为了让用户浏览网页完全在WebView中进行,我们需要增加如下代码
不增加的后果就是当用户点击一个跳转链接时,会调用系统浏览器从而跳出你的程序
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
让WebView支持JS
这个不用解释了吧,不打开JS支持怎么与JS交互呢 (- -#)
webView.getSettings().setJavaScriptEnabled(true);
让WebView支持JS的alert
webView.setWebChromeClient(new WebChromeClient());
为什么加上一个WebChromeClient就支持alert了呢?因为WebChromeClient里有这个方法
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
return super.onJsAlert(view, url, message, result);
}
给JS提供一个Native方法
webView.addJavascriptInterface(new JSCallbackInterface(), "MyJSBridge");
private class JSCallbackInterface {
@JavascriptInterface
public void myMethod() {
// native do something
}
}
JS调用Native方法可以这样调用
if(window.MyJSBridge){
window.MyJSBridge.myMethod();
}
当然,”Bridge”叫什么名字,Native Method叫什么名字,需要什么参数,你们自己来定,但是一定要让JS和Android Native的名字参数保持一致
当JS调用Native方法报”NPObject deleted”错误时,解决方案如下
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
view.addJavascriptInterface(new JSCallbackInterface(), "StagingPayBridge");
}
});
“NPObject deleted”错误,根据字面来理解应该是Native Object被删除了,这种情况出现在Web页面点击一个链接跳转后调用Android Native方法出现,每次Web页面跳转都会调用”onPageStarted”和”onPageFinished”方法,我们只需在”onPageFinished”方法中再次把Android Native Object添加即可
让JS支持https
WebView加载一些Web页加载不出来,比如支付宝的支付网页,因为是https (≧﹏ ≦)
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
});
好了,我们把上面的代码整理下
...
private void setWebView(String url){
webView.loadUrl(url);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JSCallbackInterface(), "MyJSBridge");
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
view.addJavascriptInterface(new JSCallbackInterface(), "StagingPayBridge");
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
});
}
...
...
private class JSCallbackInterface {
@JavascriptInterface
public void myMethod() {
// native do something
}
}
...
以上就是我今天开发中遇到的一些关于Android WebView的问题,分享给大家。 ^ ~ ^