开发中难免使用WebView加载url的情况,存在很多加载失败的原因,网络异常,404等等,这个时候会给用户展示一个机器人的错误页面,这个很不友好,一般会自己做一个页面覆盖这个错误页面,这个功能主要是通过在WebViewClient的几个方法中做处理,如下代码,需要在onReceivedError,onReceivedHttpError,onReceivedError这三个方法中做处理,需要在super之前做处理,需要注意的是很必要的一句代码是 view.loadUrl("about:blank");否则始终会出现错误页面,然后我们把自定义的view addView到WebView,就这样。
webView.setWebViewClient(new WebViewClient() { @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { view.loadUrl("about:blank");// 避免出现默认的错误界面 view.removeAllViews(); int width = (int) DeviceUtils.getScreenWidth(CategoryDetailActivity.this); int height = (int) DeviceUtils.dip2px(CategoryDetailActivity.this, 230); view.addView(hintWeb, width, height); iv_live_cover.setVisibility(View.GONE); webViewProgress.setVisibility(View.GONE); tv_network_error_hint.setVisibility(View.VISIBLE); super.onReceivedError(view, errorCode, description, failingUrl); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { view.loadUrl("about:blank");// 避免出现默认的错误界面 view.removeAllViews(); int width = (int) DeviceUtils.getScreenWidth(CategoryDetailActivity.this); int height = (int) DeviceUtils.dip2px(CategoryDetailActivity.this, 230); view.addView(hintWeb, width, height); int statusCode = errorResponse.getStatusCode(); if (404 == statusCode || 500 == statusCode) { iv_live_cover.setVisibility(View.GONE); webViewProgress.setVisibility(View.GONE); tv_network_error_hint.setVisibility(View.VISIBLE); } super.onReceivedHttpError(view, request, errorResponse); } @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { view.loadUrl("about:blank");// 避免出现默认的错误界面 view.removeAllViews(); int width = (int) DeviceUtils.getScreenWidth(CategoryDetailActivity.this); int height = (int) DeviceUtils.dip2px(CategoryDetailActivity.this, 230); view.addView(hintWeb, width, height); iv_live_cover.setVisibility(View.GONE); webViewProgress.setVisibility(View.GONE); tv_network_error_hint.setVisibility(View.VISIBLE); super.onReceivedError(view, request, error); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); webViewProgress.setVisibility(View.VISIBLE); // tv_network_error_hint.setVisibility(View.GONE); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); iv_live_cover.setVisibility(View.GONE); webViewProgress.setVisibility(View.GONE); if (!NetworkUtils.isAvailable(CategoryDetailActivity.this)) { tv_network_error_hint.setVisibility(View.VISIBLE); } else { tv_network_error_hint.setVisibility(View.GONE); } } });