WebView載入失敗或網路異常時,替換WebView的錯誤介面;
阿新 • • 發佈:2018-11-29
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”這個方法就行了;