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

    }

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值