webentwicklung-frage-antwort-db.com.de

webview sollte beispielsweise ein Beispiel anfordern

Ich muss wissen, wie shouldinterceptrequest funktioniert. Ich weiß nicht, wie ich diese Methode erstellen und handhaben soll, um den CSS-Link zu lesen und zu ersetzen. Vielen Dank!

27
androdio

Nun, die kurze Antwort ist, dass es ziemlich ähnlich zu shouldOverrideUrlLoading(WebView view, String url) arbeitet, wie im WebView Tutorial veranschaulicht.

Sehen Sie sich dazu den Code unten an. Sie überschreiben einfach die shouldInterceptRequest(WebView view, String url)-Methode Ihres WebViewClient. Natürlich muss man das nicht inline machen, aber aus Kompaktheit habe ich das gemacht:

    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 StringBufferInputStream("body { background-color: #F781F3; }"));
        }

        /**
         * 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");

Fangen Sie das Laden der CSS-Datei ab und geben Sie Ihre eigene WebResourceResponse zurück, die die Daten enthält, die Sie stattdessen laden möchten.

Beachten Sie, dass diese Methode API Level 11 erfordert. 

Wenn Sie etwas Ähnliches für Android 2.x machen möchten, sollten Sie versuchen, das bereits erwähnte shouldOverrideUrlLoading(WebView view, String url) zu verwenden, um das Laden der Seite zu vermeiden, manuell abzurufen, den Verweis auf die css-Datei durch einen eigenen zu ersetzen und schließlich loadData(String data, String mimeType, String encoding) (oder loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)) in der WebView, wobei der manipulierte HTML-Inhalt als Zeichenfolge übergeben wird.

Vor:

Before

Nach dem:

After

63
MH.

das könnte auch für Sie interessant sein. Es liest Dateien aus bestimmten Ordnern. Wenn eine Anfrage mit diesem Dateinamen eingeht, verwendet sie die Datei aus dem Asset-Ordner und nicht aus dem Web.

    //get list of files of specific asset folder
    private ArrayList listAssetFiles(String path) {

        List myArrayList = new ArrayList();
        String [] list;
        try {
            list = getAssets().list(path);
            for(String f1 : list){
                myArrayList.add(f1);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return (ArrayList) myArrayList;
    }

    //get mime type by url
    public String getMimeType(String url) {
        String type = null;
        String extension = MimeTypeMap.getFileExtensionFromUrl(url);
        if (extension != null) {
            if (extension.equals("js")) {
                return "text/javascript";
            }
            else if (extension.equals("woff")) {
                return "application/font-woff";
            }
            else if (extension.equals("woff2")) {
                return "application/font-woff2";
            }
            else if (extension.equals("ttf")) {
                return "application/x-font-ttf";
            }
            else if (extension.equals("eot")) {
                return "application/vnd.ms-fontobject";
            }
            else if (extension.equals("svg")) {
                return "image/svg+xml";
            }
            type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
        }
        return type;
    }

    //return webresourceresponse
    public WebResourceResponse loadFilesFromAssetFolder (String folder, String url) {
        List myArrayList = listAssetFiles(folder);
        for (Object str : myArrayList) {
            if (url.contains((CharSequence) str)) {
                try {
                    Log.i(TAG2, "File:" + str);
                    Log.i(TAG2, "MIME:" + getMimeType(url));
                    return new WebResourceResponse(getMimeType(url), "UTF-8", getAssets().open(String.valueOf(folder+"/" + str)));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    //@TargetApi(Build.VERSION_CODES.Lollipop)
    @SuppressLint("NewApi")
    @Override
    public WebResourceResponse shouldInterceptRequest(final WebView view, String url) {
        //Log.i(TAG2, "SHOULD OVERRIDE INIT");
        //String url = webResourceRequest.getUrl().toString();
        String extension = MimeTypeMap.getFileExtensionFromUrl(url);
        //I have some folders for files with the same extension
        if (extension.equals("css") || extension.equals("js") || extension.equals("img")) {
            return loadFilesFromAssetFolder(extension, url);
        }
        //more possible extensions for font folder
        if (extension.equals("woff") || extension.equals("woff2") || extension.equals("ttf") || extension.equals("svg") || extension.equals("eot")) {
            return loadFilesFromAssetFolder("font", url);
        }

        return null;
    }
1
EscapeNetscape