Android onReceivedError() 定制出错界面
如果没有网络或者访问的页面出错,WebView
会使用默认的错误页面
这可能不是我们想要的,因为它并没有实际告诉用户怎么出错了,这时候我们就要加载一个自己的出错的网页或者定制一个错误的 View
定制 WebView
出错时的界面很简单,只要在设置 setWebViewClient()
时重写 onReceivedError()
方法,根据参数 errorCode
不同显示不同的 View
即可
WebView 显示自己的出错 HTML 页面
要在 WebView
加载出错时显示自己的 HTML 页面,就要把错误 HTML 页面放到 assets
目录下
然后在 onReceivedError()
中 loadUrl("file:///android_asset/error.html")
注意: 如果你的出错页面时定制所有的错误,而非 404 403 等,那么就不能用外网地址的错误页面,不然没网络的时候还是显示系统自己的页面
-
创建一个 空的 Android 项目
cn.twle.android.WebViewErrorHTML
-
修改
AndroidManifest.xml
添加网络权限<uses-permission android:name="android.permission.INTERNET" />
-
在
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>
-
修改
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>
-
修改
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
-
创建一个 空的 Android 项目
cn.twle.android.WebViewErrorCode
-
修改
AndroidManifest.xml
添加网络权限<uses-permission android:name="android.permission.INTERNET" />
-
修改
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>
-
修改
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); } }); } }