`WebViewClient` 是一个用于处理 `WebView` 中各种事件的类。下面是 `WebViewClient` 类中常用方法的说明:
### 1. `shouldOverrideUrlLoading(WebView view, WebResourceRequest request)`
这个方法在页面加载请求时调用,用于拦截页面的跳转。返回 `true` 表示拦截这个跳转,返回 `false` 表示允许跳转。
```java
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
// 可以在这里处理特定的 URL 跳转
return false;
}
```
### 2. `onPageStarted(WebView view, String url, Bitmap favicon)`
这个方法在页面开始加载时调用。
```java
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
// 页面开始加载时的处理
}
```
### 3. `onPageFinished(WebView view, String url)`
这个方法在页面加载完成时调用。
```java
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
// 页面加载完成时的处理
}
```
### 4. `onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)`
这个方法在页面加载时遇到错误时调用。
```java
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
// 页面加载错误时的处理
}
```
### 5. `onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse)`
这个方法在接收到 HTTP 错误时调用。
```java
@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
super.onReceivedHttpError(view, request, errorResponse);
// 接收到 HTTP 错误时的处理
}
```
### 6. `onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)`
这个方法在接收到 SSL 错误时调用。
```java
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
// 忽略 SSL 证书错误,继续加载页面
handler.proceed();
// 或者取消加载
// handler.cancel();
}
```
### 7. `onLoadResource(WebView view, String url)`
这个方法在加载资源时调用。
```java
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
// 资源加载时的处理
}
```
### 8. `onPageCommitVisible(WebView view, String url)`
这个方法在页面内容开始显示时调用。
```java
@Override
public void onPageCommitVisible(WebView view, String url) {
super.onPageCommitVisible(view, url);
// 页面内容开始显示时的处理
}
```
### 9. `shouldInterceptRequest(WebView view, WebResourceRequest request)`
这个方法在请求资源时调用,可以用来拦截资源请求并返回自定义的资源。
```java
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
// 拦截资源请求并返回自定义资源
return super.shouldInterceptRequest(view, request);
}
```
### 10. `onRenderProcessGone(WebView view, RenderProcessGoneDetail detail)`
这个方法在渲染进程崩溃时调用。
```java
@Override
public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) {
// 渲染进程崩溃时的处理
return super.onRenderProcessGone(view, detail);
}
```
这些方法覆盖了 `WebViewClient` 中的常用事件处理。通过重写这些方法,可以实现对 `WebView` 各种事件的自定义处理。下面是一个示例代码,展示了如何重写这些方法:
```java
package com.example.simplebrowser;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
public class WebViewActivity extends AppCompatActivity {
private WebView webView;
private Button backButton;
private Button forwardButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
webView = findViewById(R.id.webView);
backButton = findViewById(R.id.backButton);
forwardButton = findViewById(R.id.forwardButton);
String url = getIntent().getStringExtra("url");
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setDisplayZoomControls(false);
// 启用WebView的暗黑模式
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
webSettings.setForceDark(WebSettings.FORCE_DARK_ON);
}
webView.setWebViewClient(new MyWebViewClient());
webView.loadUrl(url);
backButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (webView.canGoBack()) {
webView.goBack();
}
}
});
forwardButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (webView.canGoForward()) {
webView.goForward();
}
}
});
}
private void applyDarkMode(WebView webView) {
String css = "body, body * {" +
"background-color: #000000 !important;" +
"color: #FFFFFF !important;" +
"border-color: #444444 !important;" + // 改变边框颜色
"}" +
"a { color: #1E90FF !important; }"; // 改变链接颜色
String js = "var style = document.createElement('style'); style.innerHTML = '" + css + "'; document.head.appendChild(style);";
webView.evaluateJavascript(js, null);
}
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
// 可以在这里处理特定的 URL 跳转
return false;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
// 页面开始加载时的处理
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
// 页面加载完成时的处理
applyDarkMode(view); // 应用自定义CSS
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
// 页面加载错误时的处理
}
@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
super.onReceivedHttpError(view, request, errorResponse);
// 接收到 HTTP 错误时的处理
}
@Override
public void onReceivedSslError(WebView view, android.webkit.SslErrorHandler handler, SslError error) {
// 忽略 SSL 证书错误,继续加载页面
handler.proceed();
// 或者取消加载
// handler.cancel();
}
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
// 资源加载时的处理
}
@Override
public void onPageCommitVisible(WebView view, String url) {
super.onPageCommitVisible(view, url);
// 页面内容开始显示时的处理
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
// 拦截资源请求并返回自定义资源
return super.shouldInterceptRequest(view, request);
}
@Override
public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) {
// 渲染进程崩溃时的处理
return super.onRenderProcessGone(view, detail);
}
}
}
```
这个示例代码展示了如何在 `WebViewClient` 中重写各个方法,并在页面加载完成后应用自定义的暗黑模式 CSS。通过这些步骤,你可以实现更加定制化的 `WebView` 行为。