webview shouldinterceptrequest示例

and*_*dio 27 android webview

我需要知道这是怎么回事shouldinterceptrequest.我不知道如何创建和处理此方法来读取和替换CSS链接.谢谢!

MH.*_*MH. 64

嗯,简单的答案是,它的工作原理非常相似shouldOverrideUrlLoading(WebView view, String url),如图示的WebView教程.

为了帮助您入门,请参阅下面的代码.您只需覆盖shouldInterceptRequest(WebView view, String url)WebViewClient 的方法即可.显然你不必内联,但为了紧凑,这就是我所做的:

    WebView webview = (WebView) findViewById(R.id.webview);
    webview.setWebViewClient(new WebViewClient() {
        @Override
        public WebResourceResponse shouldInterceptRequest (final WebView view, String url) {
            if (url.contains(".css")) {
                return getCssWebResourceResponseFromAsset();
            } else {
                return super.shouldInterceptRequest(view, url);
            }
        }

        /**
         * Return WebResourceResponse with CSS markup from a String. 
         */
        @SuppressWarnings("deprecation")
        private WebResourceResponse getCssWebResourceResponseFromString() {
            return getUtf8EncodedCssWebResourceResponse(new ByteArrayInputStream("body { background-color: #F781F3; }".getBytes()));
        }

        /**
         * Return WebResourceResponse with CSS markup from an asset (e.g. "assets/style.css"). 
         */
        private WebResourceResponse getCssWebResourceResponseFromAsset() {
            try {
                return getUtf8EncodedCssWebResourceResponse(getAssets().open("style.css"));
            } catch (IOException e) {
                return null;
            }
        }

        /**
         * Return WebResourceResponse with CSS markup from a raw resource (e.g. "raw/style.css"). 
         */
        private WebResourceResponse getCssWebResourceResponseFromRawResource() {
            return getUtf8EncodedCssWebResourceResponse(getResources().openRawResource(R.raw.style));
        }

        private WebResourceResponse getUtf8EncodedCssWebResourceResponse(InputStream data) {
            return new WebResourceResponse("text/css", "UTF-8", data);
        }

    });

    webview.loadUrl("http://stackoverflow.com");
Run Code Online (Sandbox Code Playgroud)

捕获css文件的加载并返回WebResourceResponse包含要加载的数据的文件.

请注意,此方法需要API级别11.

如果你想为Android 2.x做类似的事情,你可能想尝试使用前面提到的,shouldOverrideUrlLoading(WebView view, String url)以避免加载页面,手动获取,用你自己的css文件替换引用,最后调用loadData(String data, String mimeType, String encoding) (或loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)) WebView,将操作的html内容作为字符串传递.

之前:

之前

后:

后