如何以编程方式滚动Android WebView

Ste*_*dle 29 android scroll webview

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

Ste*_*dle 47

我找到了一个更好的答案来解决这个问题.事实证明,WebView确实有scrollTo(),getScrollX()并且getScrollY()方法正如您所期望的那样.它们在文档中有点隐藏,因为它们是从View(via AbsoluteLayout- > ViewGroup- > View)继承而来的.这显然是一种WebView比有点麻烦的JavaScript界面更好的操纵滚动位置的方法.

  • 很高兴你回来添加这个:) (11认同)

Ste*_*dle 13

事实证明,window.scrollTo()DOES工作,你只是无法添加自己的方法命名scrollTo().出于某种原因scrollTo(),我打电话时调用了我自己的方法window.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);
}
Run Code Online (Sandbox Code Playgroud)

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

webView.loadUrl("javascript:scrollToElement('" + elemId + "')");
Run Code Online (Sandbox Code Playgroud)

这种方法存在一些问题,例如滚动不会很好地动画,但一般机制有效.

在DOM窗口对象不正确地报告的WebView的当前滚动位置(见window.pageXOffset,window.pageYOffset或者window.scrollX,window.scrollY)如果你只是想知道的WebView的当前滚动位置,写一些JavaScript调用Java代码,并沿X通/ Y偏移.

  • 这是因为在全局范围内声明一个函数时,它实际上被声明为全局`window`对象的属性. (2认同)