2011-11-25 69 views
22

shouldinterceptrequestの仕組みを知る必要があります。私はこのメソッドを作成して、CSSリンクを読み込んで置き換える方法を知りません。ありがとうございました!webview shouldinterceptrequestの例

答えて

57

これは、WebView tutorialに示すように、shouldOverrideUrlLoading(WebView view, String url)と非常によく似ています。

開始するには、以下のコードをご覧ください。 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:///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; 
    }