WebView加载失败或网络异常时,替换WebView的错误界面;

WebView在加载失败时会显示一个失败原因的界面,各个手机显示的界面还都不一样,部分手机还会把Url显示出来;我们要做的就是统一加载失败的界面;

大概思路:在WebView这个控件上面再覆盖一个View,监听WebView加载失败时把这个View显示出来,这样用户就看不到原来的WebView的失败界面了。

监听WebView开始加载、加载完成、加载失败;

在开始加载时,把自定义失败的View隐藏,加载失败时把这个View显示出来;

 mWebView.setWebViewClient(new WebViewClient() {

            //在开始加载网页时会回调
            @Override
            public void onPageStarted(WebView webView, String s, Bitmap bitmap) {
                super.onPageStarted(webView, s, bitmap);
                ivError.setVisibility(View.INVISIBLE);
                mWebView.setVisibility(View.VISIBLE);
            }
              //加载错误的时候会回调
            @Override
            public void onReceivedError(WebView webView, int i, String s, String s1) {
                super.onReceivedError(webView, i, s, s1);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    return;
                }
                ivError.setVisibility(View.VISIBLE);
                mWebView.setVisibility(View.INVISIBLE);
            }

            //加载错误的时候会回调
            @Override
            public void onReceivedError(WebView webView, WebResourceRequest webResourceRequest, WebResourceError webResourceError) {
                super.onReceivedError(webView, webResourceRequest, webResourceError);
                   if (webResourceRequest.isForMainFrame()) {
                    ivError.setVisibility(View.VISIBLE);
                    mWebView.setVisibility(View.INVISIBLE);
                }
            }

            //加载完成的时候会回调
            @Override
            public void onPageFinished(WebView webView, String s) {
                
            } 
        });

点击加载失败界面,重新载入这个网页;

ivError.setOnClickListener(v -> mWebView.reload());

刷新后WebView退出不了,重定向的问题解决;

在setWebViewClient这个方法中添加:

  @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String url) {
                WebView.HitTestResult hitTestResult = webView.getHitTestResult();
                //hitTestResult==null解决重定向问题(刷新后不能退出的bug)
                if (!TextUtils.isEmpty(url) && hitTestResult == null) {
                    return true;
                }
                return super.shouldOverrideUrlLoading(webView, url);
            }

看一下XML布局:

 <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <com.cc.webview.X5WebView
            android:id="@+id/mWebView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
      
        <ImageView
            android:id="@+id/ivError"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@mipmap/web_loaderror"
            android:scaleType="centerCrop"
            android:visibility="invisible"
            />
    </FrameLayout>

大概就是这样,WebView刷新后不能退出这个问题重写一下“shouldOverrideUrlLoading”这个方法就行了;

posted @ 2021-08-10 12:01  愚哦  阅读(896)  评论(0编辑  收藏  举报