2011-11-25 17 views
22

Tôi cần biết cách hoạt động của shouldinterceptrequest. Tôi không biết cách tạo và xử lý phương thức này để đọc và thay thế liên kết CSS. Cảm ơn bạn!webview shouldinterceptrequest example

Trả lời

57

Vâng, câu trả lời ngắn gọn là nó hoạt động tương tự như shouldOverrideUrlLoading(WebView view, String url), như được minh họa trong WebView tutorial.

Để giúp bạn bắt đầu, hãy xem mã bên dưới. Bạn chỉ cần ghi đè phương thức shouldInterceptRequest(WebView view, String url) của WebViewClient của bạn. Rõ ràng bạn không phải làm nội tuyến đó, nhưng vì lợi ích của chặt đó là những gì tôi đã làm:

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

Săn tải file css và gửi lại riêng WebResourceResponse của bạn có chứa các dữ liệu mà bạn muốn tải trong stead .

Lưu ý rằng phương pháp này yêu cầu Cấp API 11.

Nếu bạn muốn làm điều gì đó tương tự cho Android 2.x, bạn có thể muốn thử sử dụng trước đó được đề cập shouldOverrideUrlLoading(WebView view, String url) để tránh tải trang, tìm nạp theo cách thủ công, thay thế tham chiếu tới tệp css hãy gọi loadData(String data, String mimeType, String encoding) (hoặc loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)) trên WebView, chuyển nội dung html được xử lý dưới dạng chuỗi.

Trước:

Before

Sau:

After

+0

Vậy làm cách nào để tôi thay thế liên kết css trong tệp aspx của mình bằng tệp cục bộ và đặt trả lại webresourceresponse. – androdio

+0

Vâng, bạn không thực sự thay thế liên kết css trong tệp aspx, nhưng bất cứ khi nào tệp css được tham chiếu được tải, bạn chặn nó và thay vào đó trả lại nội dung css của riêng bạn. Tôi mở rộng mã trong câu trả lời của tôi với một ví dụ. Tôi đã không thực sự thử nó, nhưng nhìn vào tài liệu nó nên được phần nào như thế. Lưu ý rằng thay vì sử dụng chuỗi có đánh dấu css, bạn cũng có thể tải tệp từ thẻ SD hoặc tài nguyên và chuyển tệp đó với tư cách là InputStream. –

+0

Tôi đã thử một cái gì đó như thế này để đọc css từ một tập tin địa phương: InputStream im = null; Tệp tin = tệp mới ("tệp: ///android_asset/android.css"); \t \t \t try { \t \t \t \t im = new FileInputStream (file); \t \t \t} bắt (FileNotFoundException e) {} Rất tiếc, nó không tải dữ liệu của tệp. Cảm ơn rất nhiều vì sự giúp đỡ của bạn! – androdio

1

này có thể cũng thú vị cho bạn. Nó đọc các tập tin từ các thư mục cụ thể và nếu một yêu cầu là đến với tên tập tin này nó sử dụng tập tin từ thư mục tài sản và không phải là từ 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; 
    }