方案一:舊版 API (API < 23)
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
view.loadUrl("file:///android_asset/error.html"); // assets 目錄下自定義頁面
super.onReceivedError(view, errorCode, description, failingUrl);
}
});
方案二:新版 API (API ≥ 23) 推薦
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
if (request.isForMainFrame()) { // 僅主框架錯誤才替換
view.loadUrl("file:///android_asset/error.html");
}
}
// 可選:攔截所有錯誤資源
@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
if (request.isForMainFrame()) {
view.loadUrl("file:///android_asset/error.html");
}
}
});
關鍵點
assets/error.html 放入項目 src/main/assets/ 目錄。
- 調用
loadUrl 後**不返回**,讓 WebView 繼續加載自定義頁面,系統默認錯誤頁不會顯示。
- 可在 error.html 中通過
document.referrer 或傳遞參數獲取原始錯誤 URL。
進階:動態生成錯誤頁
String html = "<html><body>Error: " + error.getDescription() + "</body></html>";
view.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null);