Necesito saber cómo funciona el shouldinterceptrequest
. No sé cómo crear y manejar este método para leer y reemplazar el enlace CSS. ¡Gracias!webview shouldinterceptrequest example
Respuesta
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:
Después:
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;
}
- 1. notifyDataSetChanged example
- 2. Android WebView Protocol Handler
- 3. Python3 http.server POST example
- 4. UIManagedDocument example/tutorial
- 5. AngularJS Test Example
- 6. SQLAlchemy Example Projects
- 7. Sencha sqlite example
- 8. Compass android example
- 9. Fastcall GCC example
- 10. small haskell libClang example?
- 11. NSNotification userinfo example?
- 12. spring 3.1 @Cacheable example
- 13. .NET DDD Example
- 14. Android Scroller simple example
- 15. AS3 Memory Leak Example
- 16. F # charting example
- 17. Explaining copy constructor example
- 18. JVM getObjectSize example
- 19. Zend Framework 2 project example
- 20. Servicio real RESTful live example
- 21. GIO socket-server/-client example
- 22. sqlite example program en android
- 23. javac.exe AST programmatic access example
- 24. ¿Cómo gzip @ font-face example?
- 25. Json Schema Example for patternProperties
- 26. Land of Lisp example redundency?
- 27. F # Tail Recursive Function Example
- 28. Basic Simple Asp.net + jQuery + JSON example
- 29. AuthenticationSuccessHandler example for Spring Security 3
- 30. python-twitter streaming api support/example
Entonces, ¿cómo puedo reemplazar el enlace css en mi archivo aspx con uno local y poner el retorno webresourceresponse. – androdio
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. –
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