2010-08-26 26 views
11

Tengo una aplicación de Android que carga páginas web en una actividad con un WebView. Estoy usando la recuperación manual de la página y el uso de WebView loadDataWithBaseURL para mostrarlo en la pantalla. Todo está bien.Android: el método de WebView goBack() muestra una página en blanco

Ahora, intento anular el botón Atrás para simular que volveré a la pila del historial de WebView. Puedo anular el botón Atrás, puedo ver que hay una pila de historial en WebView, puedo ver que la URL del historial es correcta, pero cuando llamo al método de GoBack() de WebView, muestra una página en blanco .

¿Alguien se ha encontrado con esto antes o me da un par de sugerencias para seguir con esto?

Editar: Si yo uso el método LoadURL de vista Web, el botón Volver con una invalidación funciona como está previsto. Pero ¿por qué ... si tengo que manejar esto manualmente, ¿cómo empiezo a jugar con las páginas de historial?

Respuesta

1

Debe comprobar si el método canGoBack() devuelve true antes de llamar goBack()

+1

Ya lo estoy verificando. De mi descripción en la pregunta anterior, también puedo obtener lo que es la url de la historia (la página anterior). Cuando ejecuto goBack, muestra una página en blanco. – Bundeeteddee

6

que tiene el mismo problema también. Descubrí que el problema desaparecía si establecía el parámetro historyUrl en la llamada a loadDataWithBaseURL.

+0

El nombre del parámetro ha cambiado recientemente a 'failUrl' – ohhorob

+2

qué valor debemos poner en HistoryURL –

+0

He tratado de establecer HistoryURL a html/URL/wathever, pero sin éxito ... ¿alguien ha tenido éxito con eso? – miniBill

0

La única solución que he encontrado es crear una pila <cadena> y gestionar manualmente la historia

0

que estaba teniendo el mismo problema y he intentado todas las respuestas, pero nada ayudó (probado todos ellos en Nexus 5 en ejecución Malvavisco). loadDataWithBaseURL solución no era relevante para mí ya que estaba usando loadUrl en su lugar.

Ahora, esto no es una solución, pero afortunadamente lo noté. Esto es realmente extraño y solo funciona si la URL de destino termina en .html. Mi intención es ayudar a cualquier persona que enfrenta este problema, ya que sé lo molesto que puede ser. Así que por favor tengan paciencia conmigo, por favor no vote esta respuesta si cree que esto no tiene sentido.

Lo que noté es que si la URL termina en .html, que aparece la pantalla blanca cuando se pulsa el botón de regreso.

Por otro lado, si elimina ese .html de su url, obviamente solo si esto es compatible con ese sitio web (es decir, la redirección y todo se maneja correctamente en el servidor y no activa la Página 404 Error no encontrado), esa url actuará como su base esta vez y cuando presione el botón Atrás, esa pantalla en blanco no debería aparecer esta vez.

por ejemplo: usted tiene que reemplazar http://example.com/page.html a: http://example.com/page

Una vez más, no estoy fijando esto sin probar a fondo - esto funciona para mí hoy y estoy feliz de haber encontrado esto y espero que ayuda igualmente.

0

La forma en que trato esto es mantener un puntero de pila local en el número de páginas cargadas después de la página raíz cargada usando loadDataWithBaseURL.Cuando regrese, si mi puntero llega a 1, estoy en el nivel raíz y vuelvo a cargar la página raíz con loadDataWithBaseURL.

FYI, utilizo este código en Actividades con fragmentos, por lo que los fragmentos implementan la interfaz IBackButtonListener que me ayuda a capturar el botón Atrás en la actividad principal y propagar el evento al fragmento actual. Si el fragmento devuelve verdadero, significa que se ha ocupado del evento.

IBackbuttonListener.java

public interface IBackButtonListener { 
    public boolean onBackButtonPressed(); 
} 

Fragmento que implementa IBackButtonListener y tiene una vista web cargado de datos HTML.

private int historyStackPointer = 0; 

    ... 

     @Override 
      public boolean onBackButtonPressed() { 
       boolean rtn = false; 

       if (webView.canGoBack()) { 
        if(historyStackPointer > 1) { 
         webView.goBack(); 
         historyStackPointer--; 
         rtn = true; 
        }else{ 
         if(historyStackPointer == 1) { 
          // Reload the html data 
          webView.loadDataWithBaseURL("file:///android_asset/", html_data, "text/html", "UTF-8", null); 
          historyStackPointer = 0; 
          rtn = true; 
         }else{ 
          webView.loadUrl("about:blank"); 
          rtn = false; 
         } 
        } 
       } else { 
        rtn = false; 
       } 
       return rtn; 
      } 

html_data es una Cadena con el html de la página.

Cuestiones relacionadas