WebView 返回監聽以及控制

目錄

 

問題:

問題一

WebView.canGoBack()無法正確返回的問題:

解決方法

問題二

無法判斷什麼時候finish()webActivity?

通過WebBackForwardList去解決

問題三

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

還有一個這樣的。。。。。。

123

 


解決方法

 

是不是很頭疼,上面的方法可能管用,可能不管用,在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);

    }

 

發佈了23 篇原創文章 · 獲贊 9 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章