最近公司的项目用到原生和WebView的HTML中代码进行交互,遇到到不少问题,在这里记录一下,以后再用的时候方便。
- 首先说一下WebSettings的配置,它是用来管理WebView配置的类
WebSettings webSettings = webView.getSettings();//通过webView获取WebSettings
/*WebSettings常用方法*/
webSettings.setUseWideViewPort(true);// 设置此属性,可任意比例缩放
webSettings.setSupportZoom(true);//设置是否支持缩放
webSettings.setBuiltInZoomControls(true);//显示或不显示缩放按钮(wap网页不支持)
webSettings.setJavaScriptEnabled(true); //支持js
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); /*设置 缓存模式LOAD_DEFAULT:默认的缓存使用模式。在进行页面前进或后退的操作时,如果缓存可用并未过期就优先加载缓存,否则从网络上加载数据。这样可以减少页面的网络请求次数。
LOAD_CACHE_ELSE_NETWORK:只要缓存可用就加载缓存,哪怕它们已经过期失效。如果缓存不可用就从网络上加载数据。
LOAD_NO_CACHE:不加载缓存,只从网络加载数据。
LOAD_CACHE_ONLY:不从网络加载数据,只从缓存加载数据*/
webSettings.setAppCacheEnabled(true);//启用或禁用应用缓存
webSettings.setAppCachePath(String appCachePath);//设置应用缓存路径,这个路径必须是可以让app写入文件的。该方法应该只被调用一次
webSettings.setBlockNetworkImage(true);//关闭加载网络图片,在一开始加载的时候可以设置为true,当加载完网页的时候再设置为false
- WebView的WebChromeClient中常用的方法的说明
webView.setWebChromeClient(new WebChromeClient(){
//当页面加载的进度发生改变时回调,用来告知主程序当前页面的加载进度。
@Override
public void onProgressChanged(WebView view, int newProgress) {
// TODO Auto-generated method stub
super.onProgressChanged(view, newProgress);
}
//用来接收web页面的icon
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
// TODO Auto-generated method stub
super.onReceivedIcon(view, icon);
}
//用来接收web页面的title
@Override
public void onReceivedTitle(WebView view, String title) {
// TODO Auto-generated method stub
super.onReceivedTitle(view, title);
}
//处理Javascript中的Alert对话框,返回为true,就是拦截html页面不弹出 Alert,
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
// TODO Auto-generated method stub
return super.onJsAlert(view, url, message, result);
}
//处理Javascript中的Prompt对话框
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue,
JsPromptResult result) {
// TODO Auto-generated method stub
return super.onJsPrompt(view, url, message, defaultValue, result);
}
//处理Javascript中的Confirm对话框
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
// TODO Auto-generated method stub
return super.onJsConfirm(view, url, message, result);
}
});
- WebView的WebViewClient中常用的方法的说明
webView.setWebViewClient(new WebViewClient(){
//WebView加载资源调用,返回为true的话就在本app里面调用,false就在外部浏览器中打开。
//这个方法还可以拦截到打开的链接的地址,可以在此跟原生的做一些交互
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
// TODO Auto-generated method stub
return true;
}
//该方法只在WebView完成一个页面加载时调用一次
@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
super.onPageFinished(view, url);
}
//页面发生错误时候调用,这些错误通常都是由无法与服务器正常连接引起的,最常见的就是网络问题
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
// TODO Auto-generated method stub
super.onReceivedError(view, request, error);
}
});
- 在Activity中调用html的js方法
String data = "\"我是app\""
webView.loadUrl("javascript:queryRecomend(" + data + ")");
调用js方法要特别注意一下,如果传递的是字符串,就用引号把字符串包裹起来,要不然数据就传递不成功。。。。
- 在html中js调用Activity的方法
android中的代码:
/**
* 注意第二个参数JsTest,这个是JS网页调用Android方法的一个类似ID的东西
*/
mWebView.addJavascriptInterface(new JavaScriptinterface (this), "android");
public class JavaScriptinterface {
Context context;
public JavaScriptinterface(Context c) {
context= c;
}
/**
* 与js交互时用到的方法,在js里直接调用的
*/
@JavascriptInterface
public void showToast(String ssss) {
Toast.makeText(mContext, ssss, Toast.LENGTH_LONG).show();
}
}
/**
*JS代码:注意这里android.JsCallAndroid中的android和activity中的*addJavascriptInterface中的android名字要一样
*/
<script type="text/javascript">
function showToast() {
android.JsCallAndroid("哈哈啊哈 ");
}
</script>
</head>
<body>
<input type="button" value="调用"
onClick="showToast()"/>
</body>
注意:如果用shouldOverrideUrlLoading方法中通过返回的url来响应原生的一些方法时候(url中带有特殊符号,比如:& = 等。。),html的url要通过encodeURIComponent(url)进行转码,手机端通过URLDecoder.decode(url)转码获取都这个url,如果不转码进行传送回收不到这个url(IOS是这样的)。还有就是,在 原生调用JS的方法时候,传递的参数是字符串,要用 \” 把这个字符串包裹起来比如:(”\”我是app\”“),如果是数字就不必了,要不html识别不了这个字符串。