30

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

4

5 回答 5

51

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

于 2010-02-19T07:12:57.107 回答
12

事实证明window.scrollTo()确实有效,您只是不能添加自己的名为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 偏移量.

于 2010-02-10T18:19:34.563 回答
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);


    }
于 2016-04-08T16:39:21.040 回答
0

以下单行解决方案可确保将所选元素带入视野(如果不是)。在某些情况下,这可能就足够了。

webView.loadUrl("javascript:document.getElementById('"+aID+"').scrollIntoView()");
于 2020-10-25T10:48:19.490 回答
0

您无法使用 Java Code 做到这一点

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

  • 您无法使用 Java 代码滚动 web 视图或获取滚动位置。
  • 只能获取webview的layoutHeight、measuredHeight、contentHeight,仅此而已。这些都是允许您获取和设置滚动状态的 android api。
  • 但是,您可以覆盖 onScorllChanged 以添加自定义监听器用于滚动 webview 事件(或 fling 事件),您将被通知原始位置和新位置。
  • 好吧,您可以使用 JavaScript 代码滚动到某个位置,如下所示,但性能确实很差。如果您想经常滚动它,请三思而后行。

    window.scrollTo(100,500)

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

于 2015-10-26T09:04:46.790 回答