随着h5的普及, webveiw使用度越来越高,作为安卓的最复杂的控件,使用时会遇到一些头疼的bug,总结如下
当拿到webview的时候,我们往往需要根据情况做一些配置,这个地方处理不到经常会出现问题
WebSettings webSetting = getSettings();//拿取设置的方法
1 支持javaScript,现在很多界面使用了js,如果没有设置会导致点击按钮等功能失效
webSetting.setJavaScriptEnabled(true);2 支持DomStorage,当加载一些复杂的网页可能无法加载或者第一次无法加载成功,需要设置这行代码
webSetting.setDomStorageEnabled(true);
3 页面内部跳转到一些网址错误无法跳转问题
webview页面的重定向是通过设置这个监听完成
private WebViewClient client = new WebViewClient() { /** * 防止加载网页时调起系统浏览器 */ public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }通过这里设置可以保证内部一个webview跳转而无需调起系统浏览器,存在的问题是如果网址不是http,https协议的可能会无法跳转成功,因为一些协议会调起安卓原生的手机应用,比如调起支付宝,微信,携程,处理的方法是对url进行判断过滤,如果发现这种协议以活动的方式跳转
// 处理自定义scheme协议if (!url.startsWith( "http" )) {try {Intent intent = new Intent(Intent. ACTION_VIEW ,Uri. parse (url));mContext .startActivity(intent);} catch (Exception e) {e.printStackTrace();}return true ;}
需要注意的是并不是所有的协议都是跳转应用,微信和支付宝目前是可靠的,第三方网站有时候还有一些其他的重定向,根据情况不同过滤掉就好了
4 webview页面内部微信支付提示参数不对问题
这种情况多发生在使用第三方平台并且调用了第三方内部的微信购买时发生,原生是微信支付每一步跳转会比对上次的访问地址,解决方案就是增加Refer请求头,具体值为上次跳转的地址即可
//增加Referer,也就是上次重定向的地址public static Map<String,String> getH5Header(String referer)//这个地址放入上次访问的url{Map<String,String> extraHeaders = new HashMap<String, String>();extraHeaders .put( "Referer" ,referer);return extraHeaders ;}之后在请求的时候调用 view.loadUrl(url, Util. getH5Header (view.getUrl())); 完美解决问题