Conseguir la posición de documento en una vista web?
Pregunta
Para decirlo simple: Quiero un marcador en la posición actual (probablemente varias posiciones) en un archivo html muestran en una vista Web para más tarde restaurarlo. Cualquier pequeña pista ayudaría. :)
Solución
Si por "la posición actual" que significa un punto en alguna parte en una página determinada, no creo que eso es posible ... al menos no sólo a partir de Java. Todo el API de WebKit expuesta a Java carece mucho de cualquier cosa que se ocupa del contenido de las páginas.
Si usted tiene control sobre el contenido de la página, y no hay una manera de saber estas posiciones a través de páginas en Javascript, usted podría:
Paso # 1: Utilice WebView#addJavascriptInterface()
añadir un objeto con algún tipo de método recordPosition()
, guardar la información donde sea apropiado
Paso # 2:. Crear una función de JavaScript que llama recordPosition()
en el objeto inyectado
y luego o bien:
Paso # 3a: disparador que la función Javascript de sí misma Javascript (por ejemplo, basado en un clic), o
Paso 3b: A petición loadUrl("javascript:...");
en su WebView
, donde ...
se sustituye por código Javascript para activar la función Javascript desde el paso # 2
La restauración de estas posiciones tendría que trabajar de la misma manera: tiene Javascript hacer las restauraciones reales, posiblemente provocada por el código de Java
.Tenga en cuenta que no tengo ni idea de si lo que quiere (obtener / establecer la posición actual) está disponible en Javascript, ya que no soy mucho de un codificador en el navegador.
Otros consejos
El enfoque que tomé fue la siguiente:
En el método onSaveInstanceState()
, calcular a qué distancia de la página que el usuario había desplazado.
int contentHeight = webView.getContentHeight();
int scrollY = webView.getScrollY();
float scrollPercent = ((float) scrollY / ((float) contentHeight));
Stash que en el haz. Cuando se restaura la página en el método onCreate()
, espere que la página termine de cargar (en WebClient.onPageFinished()
), desplazarse hasta la posición registrada:
int contentHeight = webView.getContentHeight();
int y = (int) ((float) contentHeight * scrollPercent);
webView.scrollTo(0, y);
- El uso de un
float
y calcular una relación funciona en el caso de mover de un tirón entre el paisaje y el retrato. - Puede trabajar lo suficientemente bien pero no perfectamente cuando se mezcla con el tamaño automáticamente las imágenes.
- Escala también puede tenerse en cuenta. Me tienden a esconder la escala de preferencia en el método
onPause()
, y luegowebView.setInitialScale(scale)
antes de empezar a cargar la página. - He encontrado que la fijación de la vista web a
scrollPercent > 0
invisible cuando se ve mejor.