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.
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); }