studio pie android android-webview

pie - api de android



¿Cuál es el evento recomendado para actualizar la interfaz de usuario de WebView Navigation? (2)

WebView ofrece goBack() y goForward() para implementar el comportamiento típico de los botones de retroceso, que puede estar vinculado a los botones, a los elementos de la barra de acción, o lo que sea:

@Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.back: if (webView.canGoBack()) { webView.goBack(); } break; case R.id.fwd: if (webView.canGoForward()) { webView.goForward(); } break; case R.id.reload: webView.reload(); break; default: return(super.onOptionsItemSelected(item)); } return(true); }

WebView también tiene canGoBack() y canGoForward() , para decirle si esas son opciones viables dado el historial de navegación actual en el WebView , que se muestra arriba como guardias alrededor de las goBack() y goForward() .

En teoría, canGoBack() y canGoForward() podrían usarse para habilitar o deshabilitar botones, elementos de la barra de acción, o lo que sea. Esto le daría la típica interfaz de usuario del navegador, donde los botones de avance y retroceso solo están disponibles para el usuario cuando tendrían un efecto real.

Lo que no es obvio es cuando deberíamos llamar a canGoBack() y canGoForward() y habilitar / deshabilitar esos botones. Debería estar en:

  • onPageStarted() en un WebViewClient personalizado?
  • doUpdateVisitedHistory() en un WebViewClient personalizado?
  • en algun otro callback?
  • alguna combinacion de estos?
  • ¿Cada segundo o tan solo en un temporizador, porque no tenemos una devolución de llamada confiable para determinar cuándo deberían actualizarse?

Los documentos de canGoBack() actualmente state que devuelve true si

Este WebView tiene un elemento de historial de vuelta

canGoForward() tiene un Javadoc similar.

El problema es que no está claramente documentado cuando se ha cambiado el historial anterior. Dependería completamente de la implementación de WebView (Cliente) y esto siempre podría cambiar en el futuro. Incluso podría ser diferente en varios dispositivos / versiones / horquillas de Android.

doUpdateVisitedHistory() tampoco está documentado con claridad:

Notificar a la aplicación host para actualizar su base de datos de enlaces visitados.

El problema es que no indica CUÁNDO se llama, solo que necesita actualizar los enlaces visitados. Puede llamarse antes o después de lo que desee, según la implementación de WebView (Cliente).

Creo que la elección es suya para determinar qué tan seguro le gustaría hacer su código contra posibles fallas.

Personalmente, me gustaría actualizar con onPageStarted() , onPageFinished() y doUpdateVisitedHistory() porque funciona en todas las condiciones razonablemente esperadas y no tiene la capacidad de rendimiento de sondeo con un temporizador.
Luego lo probaría en dispositivos de varias marcas y versiones de Android para ver si se comporta como espero.
Si aún así no funciona, uno podría considerar la implementación de un temporizador / mecanismo de sondeo.


Puede verificar usando los métodos canGoBack () y canGoForward () en la onPageFinished llamada onPageFinished . De esta manera, sabe que una nueva página acaba de terminar de cargarse, por lo que puede verificar si la vista web puede avanzar o retroceder y luego habilitar / deshabilitar sus botones.

Lo usé de esta manera y funciona muy bien.