Android onReceivedError() 定制出错界面

如果没有网络或者访问的页面出错,WebView 会使用默认的错误页面

这可能不是我们想要的,因为它并没有实际告诉用户怎么出错了,这时候我们就要加载一个自己的出错的网页或者定制一个错误的 View

定制 WebView 出错时的界面很简单,只要在设置 setWebViewClient() 时重写 onReceivedError() 方法,根据参数 errorCode 不同显示不同的 View 即可

WebView 显示自己的出错 HTML 页面

要在 WebView 加载出错时显示自己的 HTML 页面,就要把错误 HTML 页面放到 assets 目录下

然后在 onReceivedError()loadUrl("file:///android_asset/error.html")

注意: 如果你的出错页面时定制所有的错误,而非 404 403 等,那么就不能用外网地址的错误页面,不然没网络的时候还是显示系统自己的页面


  1. 创建一个 空的 Android 项目 cn.twle.android.WebViewErrorHTML

  2. 修改 AndroidManifest.xml 添加网络权限

    <uses-permission android:name="android.permission.INTERNET" />
    
  3. app 上点右键选择 Folder - Assets Folder 添加一个 assets 目录,并在 assets 目录下新建一个 HTML 页面 error.html

    <!DOCTYPE html>
    <meta charset="utf-8" />
    <div style="margin:50px 20px;text-align:center">
        <p>非常抱歉,你的手机不能联网或者简单教程服务器出错了</p>
        <p>要不你点击重新刷新试一试</p>
    </div>
    
  4. 修改 activity_main.xml 添加一个 WebView

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"    
        android:layout_height="match_parent"    
        android:orientation="vertical">
        <Button
            android:layout_alignParentRight="true"
            android:id="@+id/btn_refresh"
            android:layout_width="wrap_content"    
            android:layout_height="wrap_content"
            android:text="重新加载" />
        <WebView
            android:id="@+id/ms_webview"
            android:layout_width="match_parent" 
            android:layout_height="match_parent" />
    </RelativeLayout>
    
  5. 修改 MainActivity.java

    package cn.twle.android.webviewerrorhtml;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity{
    
        private WebView ms_webview;
        private String oldUrl ="";
        private Button btn_refresh;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ms_webview = (WebView) findViewById(R.id.ms_webview);
            btn_refresh = (Button) findViewById(R.id.btn_refresh);
    
            ms_webview.loadUrl("https://www.twle.cn");
    
            ms_webview.setWebViewClient(new WebViewClient() {
                //设置在webView点击打开的新网页在当前界面显示,而不跳转到新的浏览器中
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                    return true;
                }
    
                @Override
                public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                    super.onReceivedError(view, errorCode, description, failingUrl);
    
                    if (ms_webview.getUrl().indexOf("android_asset/error.html") > 0 )
                    {
                        return;
                    }
    
                    oldUrl = ms_webview.getUrl();
                    ms_webview.loadUrl("file:///android_asset/error.html");
                }
            });
    
            btn_refresh.setOnClickListener(new View.OnClickListener(){
    
                @Override
                public void onClick(View v) {
    
                    if (ms_webview.getUrl().indexOf("android_asset/error.html") > 0 )
                    {
                        ms_webview.loadUrl(oldUrl);
                        return;
                    }
    
                    ms_webview.reload();
                }
    
            });
        }
    
    }
    

注意以下语句

if (ms_webview.getUrl().indexOf("android_asset/error.html") > 0 )
{
    return;
}

它出现在两个地方,reload() 是重新加载当前的 URL ,如果出错了点击重新加载,那么加载的还是错误的 URL;

WebView 定制出错 View

onReceivedError() 中不仅可以加载出错 HTML 页面,还可以定制自己的 View


  1. 创建一个 空的 Android 项目 cn.twle.android.WebViewErrorCode

  2. 修改 AndroidManifest.xml 添加网络权限

    <uses-permission android:name="android.permission.INTERNET" />
    
  3. 修改 activity_main.xml 添加一个 WebView

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"    
        android:layout_height="match_parent"    
        android:orientation="vertical">
        <Button
            android:layout_alignParentRight="true"
            android:id="@+id/btn_refresh"
            android:layout_width="wrap_content"    
            android:layout_height="wrap_content"
            android:text="重新加载" />
        <WebView
            android:id="@+id/ms_webview"
            android:layout_width="match_parent" 
            android:layout_height="match_parent" />
    
        <LinearLayout 
                android:id="@+id/error_view"
                android:gravity="center"
                android:layout_width="match_parent"    
                android:layout_height="match_parent"
                android:visibility="gone"   
                android:orientation="vertical">
    
            <TextView
                android:layout_width="wrap_content"    
                android:layout_height="wrap_content" 
                android:text="不好,网络不存在"/>
        </LinearLayout>
    </RelativeLayout>
    
  4. 修改 MainActivity.java

    package cn.twle.android.webviewerrorcode;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.Button;
    import android.widget.LinearLayout;
    
    public class MainActivity extends AppCompatActivity{
    
        private WebView ms_webview;
        private LinearLayout ms_error_view;
        private Button btn_refresh;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ms_webview = (WebView) findViewById(R.id.ms_webview);
            ms_error_view = (LinearLayout) findViewById(R.id.error_view);
            btn_refresh = (Button) findViewById(R.id.btn_refresh);
    
            ms_webview.loadUrl("https://www.twle.cn");
    
            ms_webview.setWebViewClient(new WebViewClient() {
                //设置在webView点击打开的新网页在当前界面显示,而不跳转到新的浏览器中
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                    return true;
                }
    
                @Override
                public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                    super.onReceivedError(view, errorCode, description, failingUrl);
                    ms_webview.setVisibility(View.GONE);
                    ms_error_view.setVisibility(View.VISIBLE);
                }
            });
    
            btn_refresh.setOnClickListener(new View.OnClickListener(){
    
                @Override
                public void onClick(View v) {
    
                    ms_webview.reload();
                    ms_error_view.setVisibility(View.GONE);
                    ms_webview.setVisibility(View.VISIBLE);
                }
    
            });
        }
    
    }
    

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.