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.

  • ¿Cómo desactivo mi diálogo de progreso después de cargar la vista web?
  • ¿No se puede reproducir el vídeo dentro de WebView mediante etiquetas iframe?
  • ¿Cómo obtener el enlace webview iframe para iniciar el navegador?
  • Versión no compatible de major.minor 52.0 al renderizar en Android Studio
  • Android Studio (0.4.6) ocultar barra de título en vista previa?
  • Cómo mover caché webView a SD?
  • Insertando textview dentro de edittext en android?
  • Android Web-View: Inyectar el archivo Javascript local a la página web remota
  • Cifrar el caché de WebView en Android
  • Gestión de iframe haga clic en Android WebView
  • Muxing vista previa de la cámara h264 codificado flujo elemental con MediaMuxer
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.