如何以编程方式滚动Android WebView

时间:2010-02-10 17:29:10

标签: android scroll webview

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

5 个答案:

答案 0 :(得分:47)

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

答案 1 :(得分: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);
}

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

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

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

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

答案 2 :(得分:0)

您不能使用Java代码

对于那些坚持这个问题的人,我对在Android中滚动webview有一些结论。

  • 您无法使用Java代码滚动网页视图或滚动位置。
  • 您只能获得webview的layoutHeight,measuredHeight,contentHeight,仅此而已。这些都是android api,允许你获取和设置滚动状态。
  • 但是,您可以覆盖onScorllChanged以添加自定义侦听器以滚动webview事件(或fling事件),您将收到原始位置和新位置的通知。
  • 嗯,您可以使用JavaScript代码滚动到某个位置,如下所示,但性能非常差。如果你想经常滚动它,请再想一想。
      

    window.scrollTo(100,500)

考虑您的情况并选择合适的解决方案。还要注意的是,投掷和滚动是不同的事情。

答案 3 :(得分:0)

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


    }

答案 4 :(得分:0)

以下单行解决方案确保所选元素出现在视图中(如果未显示)。在某些情况下这可能就足够了。

webView.loadUrl("javascript:document.getElementById('"+aID+"').scrollIntoView()");