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

还有一个这样的。。。。。。

WebView 返回监听以及控制_第1张图片

 


解决方法

 

是不是很头疼,上面的方法可能管用,可能不管用,在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, "   " +
                                        "" +
                                        "  "
                                        + " "
                                        + " " + title + "\n" + object.getData().getContext() + "",
                                "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);

    }

 

你可能感兴趣的:(WebView,Android,9.0,适配)