Cómo desplazarse mediante progtwigción Android WebView

Estoy intentando desplazar programáticamente un WebView a la ubicación de un elemento particular en el árbol DOM. Pero hasta ahora no he podido lograr que WebView responda a las solicitudes de desplazamiento. Intenté llamar a JavaScript que usa window.scrollTo(...) , pero WebView no responde. En el lado de Java, he intentado llamar al WebView.flingScroll(...) . WebView responderá a flingScroll , pero lo que necesito es una capacidad scrollTo(...) . ¿Algunas ideas?

Encontré una mejor respuesta para este problema. Resulta que WebView tiene los métodos scrollTo() , getScrollX() y getScrollY() como es de esperar. Están un poco ocultos en la documentación porque se heredan de View (a través de AbsoluteLayout -> ViewGroup -> View ). Esta es obviamente una mejor manera de manipular la posición de desplazamiento de WebView que la interfaz de JavaScript algo engorrosa.

Resulta que window.scrollTo() SI funciona, simplemente no puede agregar su propio método llamado scrollTo() . Por alguna razón, se invocaba mi propio método scrollTo() cuando llamé a window.scrollTo() .

Entonces, en resumen, para desplazar un WebView a un elemento DOM particular, escriba una función de JavaScript para hacer el desplazamiento:

 function scrollToElement(id) { var elem = document.getElementById(id); var x = 0; var y = 0; while (elem != null) { x += elem.offsetLeft; y += elem.offsetTop; elem = elem.offsetParent; } window.scrollTo(x, y); } 

y luego desde tu aplicación Android (código Java), dile a tu WebView que cargue una URL:

 webView.loadUrl("javascript:scrollToElement('" + elemId + "')"); 

Hay algunos problemas con este enfoque, como que el desplazamiento no estará bien animado, pero el mecanismo general funciona.

El objeto de ventana DOM informa la posición de desplazamiento actual de WebView correctamente (consulte window.pageXOffset , window.pageYOffset o window.scrollX , window.scrollY) . Si solo desea conocer la posición de desplazamiento actual de WebView, escriba algo de JavaScript para llamar a su código Java y pasar los desplazamientos X / Y.

No puedes hacer eso usando Java Code .

Para todos los que están atrapados en este problema, tengo alguna conclusión sobre el desplazamiento de una vista web en Android.

  • No puede desplazarse por una vista web u obtener una posición de desplazamiento usando Java Code.
  • Solo puedes obtener layoutHeight, measuredHeight, contentHeight de una webview, nada más. Estas son todas las aplicaciones Android que te permiten obtener y configurar el estado del scroll.
  • Sin embargo, puede anular el onScorllChanged para agregar un oyente de autodefinición para desplazarse por el evento webview (o evento fling), se le notificará la posición de origen y la nueva posición.
  • Bueno, puede desplazarse a una posición usando código JavaScript, como el siguiente, pero el rendimiento es realmente pobre. Si desea desplazarse con frecuencia, por favor, revísela.

    window.scrollTo (100,500)

Considere su situación y elija una solución adecuada. También se notará que fling y scroll son cosas diferentes.

  @Override public void onPageFinished(final WebView view, String url) { super.onPageFinished(view, url); new Handler().postDelayed(new Runnable() { @Override public void run() { if (app.scrollCache.containsKey(app.srctid)) { app.scrollSpot=app.scrollCache.get(app.srctid); view.scrollTo(0,(int)app.scrollSpot); } pageFinished=true; } }, 200); }