如何以编程方式滚动Android WebView

我试图以编程方式将WebView滚动到DOM树中特定元素的位置。 但到目前为止,我还没有能够让WebView响应滚动请求。 我试着调用使用window.scrollTo(...) JavaScript,但WebView不响应。 在Java方面,我试着调用WebView.flingScroll(...)方法。 WebView将响应flingScroll ,但我需要的是scrollTo(...)function。 有任何想法吗?

Solutions Collecting From Web of "如何以编程方式滚动Android WebView"

我已经find了更好的答案来解决这个问题。 事实certificate, WebView确实有你所期望的scrollTo()getScrollX()getScrollY()方法。 它们有点隐藏在文档中,因为它们是从Viewinheritance的(通过AbsoluteLayout – > ViewGroup – > View )。 这显然是操纵WebView的滚动位置的更好方法,而不是有点繁琐的JavaScript接口。

事实certificate, window.scrollTo()工作,你只是不能添加你自己的方法名为scrollTo() 。 出于某种原因,当我调用window.scrollTo()时,我自己的scrollTo()方法被调用。

因此,总而言之,要将WebView滚动到特定的DOM元素,请编写JavaScript函数来执行滚动操作:

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

然后从你的Android应用程序(Java代码)中,告诉你的WebView加载一个URL:

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

这种方法存在一些问题,如滚动不会很好地animation,但一般的机制起作用。

DOM窗口对象确实报告了WebView的当前滚动位置(参见window.pageXOffsetwindow.pageYOffsetwindow.scrollXwindow.scrollY) 。 如果您只想知道WebView的当前滚动位置,请编写一些JavaScript来调用Java代码并传递X / Y偏移量。

你不能使用Java代码来做到这一点

对于被困在这个问题的所有人,我有关于在an​​droid中滚动webview的一些结论。

  • 您不能使用Java代码来滚动webview或滚动位置。
  • 你只能得到layoutHeight,measuredHeight,webView的contentHeight,没有更多。 这些都是允许你在获取和设置滚动状态的android api。
  • 但是,你可以重载onScorllChanged来添加一个自定义的监听器来滚动webview事件(或者fling事件),你会被通知到原来的位置和新的位置。
  • 那么,您可以使用JavaScript代码滚动到某个位置,如下所示,但性能非常差。 如果你想经常滚动它,请再说一遍。

    window.scrollTo(100,500)

考虑你的情况,并select一个适当的解决scheme。 另外要注意的是,扔和滚动是不同的东西。

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