2011-11-25 82 views

回答

57

那麼,簡短的回答是,它的工作原理與shouldOverrideUrlLoading(WebView view, String url)非常相似,如WebView tutorial所示。

爲了幫助您入門,請參閱下面的代碼。您只需覆蓋WebViewClient的shouldInterceptRequest(WebView view, String url)方法。顯然,你沒有做內聯,但緊湊的緣故,這就是我所做的:

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

趕上CSS文件的加載和返回自己WebResourceResponse包含要加載代替數據。

請注意,此方法需要API級別11

如果你想爲Android 2.x做類似的事情,你可能想嘗試使用前面提到的shouldOverrideUrlLoading(WebView view, String url)來避免加載頁面,手動獲取它,用你自己的替換引用到css文件,最後請在WebView上調用loadData(String data, String mimeType, String encoding)(或loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)),並以字符串形式傳遞操作的html內容。

前:

​​

後:

After

+0

那麼我該如何將我的aspx文件中的css鏈接替換爲本地文件並放入返回webresourceresponse中。 – androdio

+0

好吧,你實際上並沒有替換aspx文件中的css鏈接,但是每當加載引用的css文件時,你都會攔截它並取而代之返回你自己的css內容。我用一個例子擴展了我的答案中的代碼。我沒有真的嘗試過,但看看它應該有點像這樣的文檔。請注意,代替使用帶css標記的字符串,您也可以從SD卡或資源加載文件,並將其作爲InputStream傳遞。 –

+0

我試過這樣從本地文件中讀取css: InputStream im = null; File file = new File(「file:///android_asset/android.css」); \t \t \t嘗試{ \t \t \t \t IM =新的FileInputStream(文件); \t \t \t} catch(FileNotFoundException e){} 不幸的是,它不會加載文件的數據。非常感謝你的幫助! – androdio

1

,這可能是也爲你有意思。它從特定文件夾中讀取文件,如果請求以該文件名傳入,它將使用資產文件夾中的文件,而不是來自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; 
    }