Android webView shouldOverrideUrlLoading para iframes
Tengo un sitio web local que es controlado por JavaScript y lo estoy cargando en un WebView. El sitio web es realmente una página principal con un iframe cuyo contenido cambia basado en la entrada del usuario. Hay un botón "Siguiente" en la página principal que ejecuta algunas funciones javascript y decide qué página cargar en el iframe (a través de document.getElement (…). Src =)
En Android 2.1 las cosas estaban funcionando bien – simuladas y en el teléfono. La vista web cargaba todas las páginas correctamente. Lo probé en un teléfono 2.2 y siempre que haga clic en Siguiente la página (que se debe cargar en el iframe) se carga en el navegador predeterminado.
- Vista web de Android: borra completamente el caché
- Android WebView no carga la segunda página desde la memoria caché
- Compruebe si url está en caché webview android
- Averigüe si Android WebView muestra la página en caché
- La configuración LOAD_NO_CACHE de WebView aún guarda archivos en el disco?
Definí un filtro de intento
<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="file" android:host="*" android:pathPrefix="sdcard/Android/data/android.website/files/pages" /> </intent-filter>
con la esperanza de que redirija las solicitudes de página a la actividad, pero no funciona. La URL sigue cargada por el navegador.
Usar shouldOverredeUrlLoading no funciona bien porque el enlace que se carga es el del marco interno. He intentado cargar código javascript que establece que url como el src de la iframe, pero no funcionó.
Es extraño que esto sólo suceda en el teléfono 2.2. En un emulador 2.2 funciona bien.
¿Algunas ideas?
- Vista previa no mostrada en Android 3.0 Canary
- Nexus 4 aspecto de vista previa de la cámara ¿La relación siempre requiere una vista de superficie 16x9? Por qué
- 101 maneras de borrar una caché de WebView - todas las cuales no funcionan
- WebView no mostrar el sitio web cuando está fuera de línea
- No hay opción "Docked Mode" en la configuración de "Preview" en Android Studio una vez desacoplada
- ¿Puedo usar el Android 4 HttpResponseCache con una aplicación basada en WebView?
- Android studio designer preview: cómo incluir el marco del dispositivo?
- ¿Alguien ha limitado con éxito el tamaño de la caché de su WebView?
Trate de proporcionar su propio WebViewClient
a WebView. Debe anular shouldOverrideUrlLoading(..)
y devolver false
.
Android 4.x parece comportarse de la siguiente manera:
shouldOverrideUrlLoading
se llama sólo cuando toda la página está a punto de cambiar.
El iframe es sólo una parte de la página. Por shouldOverrideUrlLoading
tanto shouldOverrideUrlLoading
no se llama.
El reemplazar public WebResourceResponse shouldInterceptRequest(WebView view, String url)
funcionó para mí.
Parece que no hay una forma adecuada de detener el WebResourceResponse
. Sin embargo, puede cargar otra URL:
public WebResourceResponse shouldInterceptRequest(WebView view, String url) { if( url.contains("myFancyUrl") ) { // Do something try { return new WebResourceResponse("", "", new URL("http://myserver.com/myrootdocument.html").openStream()); } catch(Exception exception) { Log.e( exception.toString() ); } } return super.shouldInterceptRequest(view, url); }
Sólo confirmar que la sustitución del método shouldOverideUrlLoading (como se describe más arriba) funcionó para mí también … Sucede que está utilizando phonegap, por lo que necesitaba para anular el objeto GapViewClient de phonegap como se muestra a continuación. Mismo concepto básico aunque.
public class XXXX_Activity extends DroidGap { /** Called when the activity is first created. * @param view */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.loadUrl("file:///android_asset/www/RLO/index.htm"); // Overide selected methods in webview client used by phone gap to prevent // iframe replacements from taking over entire web page. super.appView.setWebViewClient(new DroidGap.GapViewClient(this) { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } }); }
Creo shouldOverrideUrlLoading sólo se llama para la URL de la página inicial – no iFrames. Consulte outPageFinished (también en WebViewClient). Eso generalmente se llama para cada iFrame, aunque he visto diferencias en el comportamiento entre Android 2.1 y 2.2.
Tenga en cuenta que onPageFinished devuelve void, por lo que no hay forma de decirle al WebView que no dibuje el marco, y en cualquier caso debería haberlo dibujado en ese punto. Pero siempre puede supervisar las URL en onPageFinished y, cuando vea la URL de interés, oculte WebView (donde puede necesitar cambiar de vista) y, a continuación, inicie su nueva actividad.
- Leer el contenido del archivo de expansión APK (del archivo obb)
- Recuperar una cadena devuelta de AsyncTask en Android