最近项目中WebView返回时需要一级一级返回,就使用到WebView.goBack()方法。可当加载重定向的URL,出现了不能正常退出WebView的问题。
问题描述
比如,加载此重定向URL:http://news.cctv.com/m/la/index.shtml?id=ARTIPelLhipU21KF1nsbxpA7180816
在设置WebView的setWebViewClient()时,重写了shouldOverrideUrlLoading()、onReceivedSslError()、onPageFinished()等方法,如下:
//如果不设置WebViewClient,请求会跳转系统浏览器
webView.setWebViewClient(new WebViewClient(){
//覆写shouldOverrideUrlLoading实现内部显示网页
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
//重写此方法可以让webview处理https请求
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
LogUtil.d(TAG,"onReceivedSslError"+error.toString());
handler.proceed();// 接受所有网站的证书;2.handler.cancel()-Android默认的处理方式;3.handleMessage(Message msg); // 进行其他处理
}
@Override
public void onPageFinished(WebView view, String url) {
LogUtil.d(TAG,"onPageFinished url = "+url);
...
super.onPageFinished(view, url);
}
});
返回时,
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK) {
if(webView.canGoBack()){
//当WebView不是处于第一页面时,返回上一个页面
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView.goBack();
return true;
}else {
//当WebView处于第一页面时,直接退出
finish();
}
}
return super.onKeyDown(keyCode, event);
}
当加载重定向的URL时,点击物理返回按键时webview.canGoBack()判断为true,即就调用webview.goBack()方法,这时shouldOverrideUrlLoading()方法中return true,表示是程序自己来处理goBack()后的URL加载,当加载重定向URL会变成一个死循环,不会正常退出WebView。
解决方法
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// view.loadUrl(url);
// return true;
LogUtil.d(TAG,"shouldOverrideUrlLoading");
return false;
}
shouldOverrideUrlLoading()方法中return false,表示就会交给WebView来进行处理,WebView内部识别出重定向URL并进行finish操作。
最终,问题得以解决。