Android WebView无法返回上一页的问题。
2017-02-20 10:03
471 查看
最近在做WebView的开发,发现安卓的webview确实有好多坑。主要说一下WebView无法正常返回上一页的问题。
首先WebView的基本配置。
AndroidManifest.xml添加权限
然后发现出现了一些html中的页面中部分返回键无法返回,js中的代码是history.back();检查webview的url,发现当url的前缀从https的域名跳转http的时候会无反应。
一方面可以增加如下配置。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(...)
WebView webview = findViewById...;
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);//支持js
webSettings.setDomStorageEnabled(true);//支持DOM API
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//设置当一个安全站点企图加载来自一个不安全站点资源时WebView的行为,
//在这种模式下,WebView将允许一个安全的起源从其他来源加载内容,即使那是不安全的.
//如果app需要安全性比较高,不应该设置此模式
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);//解决app中部分页面非https导致的问题
}
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
// return false;//可以解决由于重定向导致的webview.goback()无法返回的问题
view.loadUrl(url);
return true;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
Log.e(TAG, "onReceivedSslError");
handler.proceed();// 接受所有网站的证书
//super.onReceivedSslError(view, handler, error);
}
});
}
如果发现还有问题还可以尝试重写JS方法,注:谨慎使用
但是即便如此,在部分android5.1系统(oppor9,oppor9s等)仍然存在不能正常返回的问题。所以需要自己去查询history队列,然后loadURL
首先WebView的基本配置。
@Override public boolean onKeyDown(int keyCode, KeyEvent keyEvent) { if (keyCode == keyEvent.KEYCODE_BACK) {//监听返回键,如果可以后退就后退 if (webView.canGoBack()) { webView.goBack(); return true; } } return super.onKeyDown(keyCode, keyEvent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(...) WebView webview = findViewById...; WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true);//支持js webSettings.setDomStorageEnabled(true);//支持DOM API }
AndroidManifest.xml添加权限
<?xml version="1.0" encoding="utf-8"?>
然后发现出现了一些html中的页面中部分返回键无法返回,js中的代码是history.back();检查webview的url,发现当url的前缀从https的域名跳转http的时候会无反应。
一方面可以增加如下配置。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(...)
WebView webview = findViewById...;
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);//支持js
webSettings.setDomStorageEnabled(true);//支持DOM API
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//设置当一个安全站点企图加载来自一个不安全站点资源时WebView的行为,
//在这种模式下,WebView将允许一个安全的起源从其他来源加载内容,即使那是不安全的.
//如果app需要安全性比较高,不应该设置此模式
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);//解决app中部分页面非https导致的问题
}
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
// return false;//可以解决由于重定向导致的webview.goback()无法返回的问题
view.loadUrl(url);
return true;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
Log.e(TAG, "onReceivedSslError");
handler.proceed();// 接受所有网站的证书
//super.onReceivedSslError(view, handler, error);
}
});
}
如果发现还有问题还可以尝试重写JS方法,注:谨慎使用
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(...) WebView webview = findViewById...; WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true);//支持js webSettings.setDomStorageEnabled(true);//支持DOM API if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //设置当一个安全站点企图加载来自一个不安全站点资源时WebView的行为, //在这种模式下,WebView将允许一个安全的起源从其他来源加载内容,即使那是不安全的. //如果app需要安全性比较高,不应该设置此模式 webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);//解决app中部分页面非https导致的问题 } webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub // return false;//可以解决由于重定向导致的webview.goback()无法返回的问题 view.loadUrl(url); return true; } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { Log.e(TAG, "onReceivedSslError"); handler.proceed();// 接受所有网站的证书 //super.onReceivedSslError(view, handler, error); } }); webView.addJavascriptInterface(new JsObject(webView), "history");//重写了webview中的js方法 } class JsObject { private static final String TAG ="JsObject" ; private WebView JsObjectwebView; public JsObject(WebView webView) { JsObjectwebView = webView; } @JavascriptInterface public void back() { JsObjectwebView.post(new Runnable() { @Override public void run() { Log.i(TAG, "goBack:"); JsObjectwebView.goBack(); } }); } @JavascriptInterface public void forward() { Log.i(TAG, "forward:"); JsObjectwebView.post(new Runnable() { @Override public void run() { JsObjectwebView.goForward(); } }); } @JavascriptInterface public void go(final String i) { JsObjectwebView.post(new Runnable() { @Override public void run() { JsObjectwebView.goBackOrForward(Integer.parseInt(i)); } }); } }
但是即便如此,在部分android5.1系统(oppor9,oppor9s等)仍然存在不能正常返回的问题。所以需要自己去查询history队列,然后loadURL
private int androidVersion;//系统版本 private int listSize;//历史长度 private int historyPostion;//历史索引位置 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(...) WebView webview = findViewById...; WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true);//支持js webSettings.setDomStorageEnabled(true);//支持DOM API if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //设置当一个安全站点企图加载来自一个不安全站点资源时WebView的行为, //在这种模式下,WebView将允许一个安全的起源从其他来源加载内容,即使那是不安全的. //如果app需要安全性比较高,不应该设置此模式 webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);//解决app中部分页面非https导致的问题 } webView.setWebViewClient(new WebViewClient() { @Override public void onFormResubmission(WebView view, Message dontResend, Message resend) { resend.sendToTarget(); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub // return false;//可以解决由于重定向导致的webview.goback()无法返回的问题 if (androidVersion == 22) {//安卓5.1webview.goback()无法正常返回。 WebBackForwardList list = webView.copyBackForwardList();//webView队列 listSize = list.getSize(); historyPostion = listSize; } view.loadUrl(url); return true; } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { Log.e(TAG, "onReceivedSslError"); handler.proceed();// 接受所有网站的证书 //super.onReceivedSslError(view, handler, error); } }); webView.addJavascriptInterface(new JsObject(webView), "history");//重写了webview中的js方法 } @Override public boolean onKeyDown(int keyCode, KeyEvent keyEvent) { if (keyCode == keyEvent.KEYCODE_BACK) {//监听返回键,如果可以后退就后退 if (webView.canGoBack()) { if (androidVersion == 22) {//部分android5.1 webview存在问题,需要自己查找历史记录并loadUrl WebBackForwardList list = webView.copyBackForwardList(); historyPostion--; String url = list.getItemAtIndex(historyPostion).getUrl(); webView.loadUrl(url); } else { webView.goBack(); } return true; } } return super.onKeyDown(keyCode, keyEvent); } class JsObject { private static final String TAG ="JsObject" ; private WebView JsObjectwebView; public JsObject(WebView webView) { JsObjectwebView = webView; } @JavascriptInterface public void back() { JsObjectwebView.post(new Runnable() { @Override public void run() { Log.i(TAG, "goBack:"); JsObjectwebView.goBack(); } }); } @JavascriptInterface public void forward() { Log.i(TAG, "forward:"); JsObjectwebView.post(new Runnable() { @Override public void run() { JsObjectwebView.goForward(); } }); } @JavascriptInterface public void go(final String i) { JsObjectwebView.post(new Runnable() { @Override public void run() { JsObjectwebView.goBackOrForward(Integer.parseInt(i)); } }); } }
相关文章推荐
- android webview中加入无线淘宝客页面点击宝贝详情链接进入宝贝详情页面后无法返回问题
- android Webview中注入js,用于解决第三方页中出现返回事件window.history.go(-1),无法响应问题
- Android学习之实现WebView中input="file"选择文件,处理选择图片无法返回类型问题
- shouldOverrideUrlLoading()重定向,无法返回跳出WebView的问题
- Android WebView开发中无法调音量的问题解决
- android webview: 视频全屏播放按返回页面被放大的问题
- android webview 如何去广告和如何解决重定向返回的问题。
- Android 使用Webview无法播放视频问题的解决办法
- android webView 无法播放视频,无法暂停,继续播放视频问题,无法根据浏览器居中显示内容问题
- Android的WebView退出后flash视频播放器无法退出的问题:
- android webview 加载重定向页面时点击无法回退,导致重复加载当前页面问题的解决方案
- 解决Android中WebView视频无法播放的问题
- Android使用WebView无法定位问题的解决方法
- android中加载webview自定义的返回键具有返回上一页的功能
- Android利用WebView开发browser中flash无法播放的问题
- Android的WebView退出后flash视频播放器无法退出的问题
- 解决Android使用WebView时无法输入数字和字母的问题
- android 使用webview访问优酷无法播放视频的问题
- android webView 无法播放视频,无法暂停,继续播放视频问题,无法根据浏览器居中显示内容问题
- Android的WebView退出后flash视频播放器无法退出的问题