1. 程式人生 > >WebView載入失敗或網路異常時,替換WebView的錯誤介面;

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”這個方法就行了;