目录
加载CSS样式页面,URL未设置,通过什么去判断返回条件与结束页面条件
问题:
H5内部使用路由器加载新界面时,WebView.canGoBack()==False,无法返回?
WebView首页加载Url,Url内部自动重新定向导致 WebView.goBack()跳不出去?
无法判断什么时候finish()webActivity?
加载CSS样式页面,URL未设置,通过什么去判断返回条件与结束页面条件
别担心,这个坑我已经爬过,现在给大家分享一下,如果还有问题,请大家在下面留言,我会积极更正与修改!
问题一
WebView.canGoBack()无法正确返回的问题:
网上查了一下有很多类似的问题,五花八门的解决方法,
有人说下面的方法可以解决:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//Android8.0以下的需要返回true 并且需要loadUrl;8.0之后效果相反
if(Build.VERSION.SDK_INT<26) {
view.loadUrl(url);
return true;
}
return false;
}
还有一个这样的。。。。。。
解决方法
是不是很头疼,上面的方法可能管用,可能不管用,在webview里面使用一堆设置来解决这个问题,问题对症了还好,不对症,最后搞的焦头烂额的,心情也很烦躁,我想了一个办法,就是用h5代码去运行Back()的操作:
mWebView.loadUrl("javascript:window.history.back(-1)");
以上代码需要给WebView设置一下代码才会有作用:
mWebView.getSettings().setJavaScriptEnabled(false);
这样无论H5页面用什么方式跳转 我只掉这个方法就可以让他自己去回退,相当于绕过了对WebView的直接控制,稍后我发代码,我们需要双重保险,But...there have a BUG,在web页面自己退到根页面是不会自己退出界面的,也就是,我们需要判断在什么时候 Activity.finish();
问题二
无法判断什么时候finish()webActivity?
在WebView.canGoBack()==False 时,在内部Url自动重定向时,是不是感到还得通过各种方法去判断监听URl的变化,好痛苦,不知阁下可否见过这个类WebBackForwardList,通过名字你可能可以看出来它的作用,网上也有他的一些介绍,但是我们这里的使用方法可能与网上的不太相同,我们只使用它第一条数据,也就是展示的第一个页面(页面自动重定向之后,第一个页面时重定向之后的,这个集合将不包含我们传入的URL)。
通过WebBackForwardList去解决
WebBackForwardList webBackForwardList = mWebView.copyBackForwardList();
if (webBackForwardList.getSize() > 0) {
firstUrl = webBackForwardList.getItemAtIndex(0).getUrl();
}
String thisUrl= mWebView.getUrl()
if(thisUrl.equest(firstUrl)){
// 已经退到第一个界面了
finish();
}else{
mWebView.loadUrl("javascript:window.history.back(-1)");
}
这样搞是不是简单明了
BUT,还有一个问题呢
问题三
加载CSS样式页面,URL未设置,通过什么去判断返回条件与结束页面条件
当通过CSS样式页加载页面比如下面这种:
mWebView.loadDataWithBaseURL(null, "<!DOCTYPE html> <html> <head lang=\"en\"> " +
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">" +
" <meta name=\"viewport\" content=\"width=device-width,height=device-height,user-scalable=no,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,target-densitydpi=device-dpi\"/> "
+ "<title></title><script> document.getElementsByTagName(\"html\")[0].style.fontSize=window.screen.width/10+\"px\";</script> <style>"
+ "input,textarea{margin:0;padding:0;border:none; outline:none;}textarea{resize:none; overflow:auto;}em{ font-style:normal;} ul{margin:0;padding:0; list-style:none;} h1,p,h2,h3{margin:0; font-weight:normal;}"
+ " a,input{-webkit - tap - highlight - color:rgba(255, 0, 0,0);margin: 0;padding: 0;} img{ border:none; vertical-align:middle;} body{margin:0;position:relative; line-height:0.56rem;font-size:0.4rem;text-align:left;}"
+ " p,div{margin:0.2rem auto 0;font-size:0.4rem;color: #666;line-height:0.56rem;width: 8.3rem;} a{font-size:0.4rem;color: #3270ef;text-decoration: none} img{margin:0.2rem auto;display: block;width: 8.3rem;}</style></head>"
+ "<body> " + title + "\n" + object.getData().getContext() + "</body></html>",
"text/html", "utf-8", null);
mWebView.getUrl()的结果为
about:blank
那我们就可以直接去判断这个字符串,mWebView.getUrl().equals("about:blank");
代码献上:
private String firstUrl = "";//在进入界面的时候如果有URL 直接赋值
private final String NULL_URL = "about:blank";
private final String BACK_COMMAND = "javascript:window.history.back(-1)";
public boolean onPageBack() {
WebBackForwardList webBackForwardList =webFragment.getWebView().copyBackForwardList();
if (webBackForwardList.getSize() > 0) {
firstUrl = webBackForwardList.getItemAtIndex(0).getUrl();
}
if (webFragment != null && webFragment.getWebView() != null) {
String url = webFragment.getWebView().getUrl();
if (webFragment.getWebView().canGoBack()) {
if (url.equals(firstUrl) || url.equals(NULL_URL)) {
finish();
} else {
webFragment.getWebView().goBack();
}
return true;
} else {
//如果当前URL是首页URL,则直接退出
if (url.equals(firstUrl) || url.equals(NULL_URL)) {
finish();
} else {
webFragment.getWebView().loadUrl(BACK_COMMAND);
}
return true;
}
}
return false;
}
@Override
public final boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
return onPageBack();//拦截事件
case KeyEvent.KEYCODE_MENU:
break;
case KeyEvent.KEYCODE_HOME:
// 收不到
break;
case KeyEvent.KEYCODE_APP_SWITCH:
// 收不到
break;
default:
break;
}
return super.onKeyDown(keyCode, event);
}