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.

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?

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.

  • Android WebView no carga la segunda página desde la memoria caché
  • Gestión de iframe haga clic en Android WebView
  • Nexus 4 aspecto de vista previa de la cámara ¿La relación siempre requiere una vista de superficie 16x9? Por qué
  • ¿Puedo usar el Android 4 HttpResponseCache con una aplicación basada en WebView?
  • Averigüe si Android WebView muestra la página en caché
  • 101 maneras de borrar una caché de WebView - todas las cuales no funcionan
  • Android Web-View: Inyectar el archivo Javascript local a la página web remota
  • Compruebe si url está en caché webview android
  • No hay opción "Docked Mode" en la configuración de "Preview" en Android Studio una vez desacoplada
  • La configuración LOAD_NO_CACHE de WebView aún guarda archivos en el disco?
  • ¿Alguien ha limitado con éxito el tamaño de la caché de su WebView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.