目錄
加載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);
}