2011-11-25 13 views

Respuesta

57

Bueno, la respuesta corta es que funciona bastante similar a shouldOverrideUrlLoading(WebView view, String url), como se ilustra en el WebView tutorial.

Para comenzar, vea el siguiente código. Simplemente anula el método shouldInterceptRequest(WebView view, String url) de su WebViewClient. Obviamente, usted no tiene que hacer eso en línea, pero en aras de la compacidad eso es lo que hice:

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

captura la carga del archivo css y devuelve su propia WebResourceResponse contiene los datos que desea cargar en la utilidad .

Tenga en cuenta que este método requiere Nivel de API 11.

Si desea hacer algo similar para Android 2.x, puede intentar usar el shouldOverrideUrlLoading(WebView view, String url) antes mencionado para evitar cargar la página, buscarla manualmente, reemplazar la referencia al archivo css por la suya, y finalmente llame al loadData(String data, String mimeType, String encoding) (o loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)) en WebView, pasando el contenido html manipulado como una cadena.

Antes:

Before

Después:

After

+0

Entonces, ¿cómo puedo reemplazar el enlace css en mi archivo aspx con uno local y poner el retorno webresourceresponse. – androdio

+0

Bueno, en realidad no reemplaza el enlace css en el archivo aspx, pero cada vez que se carga el archivo css al que se hace referencia, lo intercepta y en su lugar devuelve su propio contenido CSS. Extendí el código en mi respuesta con un ejemplo. Realmente no lo he intentado, pero mirando la documentación debería ser algo así. Tenga en cuenta que en lugar de usar una cadena con el marcado css, también puede cargar un archivo desde la tarjeta SD o recursos y pasarlo como InputStream. –

+0

Intenté algo así para leer css desde un archivo local: InputStream im = null; Archivo file = new File ("file: ///android_asset/android.css"); \t \t \t try { \t \t \t \t im = new FileInputStream (archivo); \t \t \t} catch (FileNotFoundException e) {} Desafortunadamente no carga los datos del archivo. ¡Muchas gracias por tu ayuda! – androdio

1

esto podría ser también interesante para usted. Lee archivos de carpetas específicas y si hay una solicitud entrante con este nombre de archivo, utiliza el archivo de la carpeta de activos y no el de la 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; 
    }