美文网首页
WebViewClient类中的方法

WebViewClient类中的方法

作者: AIDE_Cking | 来源:发表于2024-07-01 10:32 被阅读0次

    `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` 行为。

    相关文章

      网友评论

          本文标题:WebViewClient类中的方法

          本文链接:https://www.haomeiwen.com/subject/jgjmcjtx.html