0

我目前在使用 Android webview scrollTo 功能时遇到问题。我让它正常工作(有时),但是当我点击 webview 中的链接时,它有时会将屏幕重置回 0,0 位置。

这是我的代码。

        public void onPageFinished(WebView webview, String Url) {
            final WebView newView = webview;

            if (ScrollX > 0) { // <-- int variable containing users Scroll position
                newView.postDelayed(new Runnable() {
                    public void run() {
                        if (view.getScrollX() > 0) {
           // ScrollX and ScrollY sometimes get reset before scrollTo happens, Why?
                            newView.scrollTo(ScrollX, ScrollY);
                            pageloaded = true; 
                        } else {
                            newView.scrollTo(ScrollX, ScrollY);
                            newView.post(this);
                        }
                    }
                }, 10);
            }
        }

所以这就是发生的事情。在我的 webviews onPageFinished 上,我将我的 webviews 滚动位置从默认的 0,0 更改为用户将滚动位置设置为的任何值。我使用 webviews postDelayed 来延迟事情,直到 webview 完全加载。每隔 10 毫秒,我的 postDelayed 会检查 webviews getScrollX() 是否返回 > 0(表示 webview 已加载)。如果是这样,它会更改代码的 webview 滚动位置部分,并最终确定 webview 已加载。如果没有,代码会在尝试设置 webviews 滚动位置后重新运行。这样下一次,我的 if 语句可以评估为 true 并避免重新运行代码部分。

现在问题来了,当我使用 view.getScrollX() > 0 来确定是否已加载 webview 时,它工作正常。但有时, view.getScrollX() > 0 将评估为真。但是当我使用 webview scrollTo 函数时,我的 ScrollX 和 ScrollY 变量在 scrollTo 之前或在使用 scrollTo 期间被重置,并且 webview 只是回到 0,0。这里发生了什么?

4

1 回答 1

1

好吧,我意识到发生了什么事。即使 webview.getScrollX() 正式开始具有值,webview 有时也没有完全加载。所以通过一点点调整,我想出了这个......

      public void onPageFinished(WebView webview, String Url) {
        final WebView newView = webview;

        if (ScrollX > 0) { // <-- int variable containing users Scroll position
            newView.postDelayed(new Runnable() {
                public void run() {
                    if (newView.getProgress() == 100) {
                        newView.postDelayed(new Runnable() {
                            public void run() {
                            newView.scrollTo(ScrollX, ScrollY);
                            pageloaded = true; 
                            }
                        }, 10);
                    } else {
                        newView.post(this);
                    }
                }
            }, 10);
        }
    }

现在那段代码很漂亮。太棒了,我正在检查 webview 进度是否达到 100%,如果没有,我会循环回到可运行文件。然后,当我的 webview 加载到 100% 时,我添加了一个 postDelayed,因为即使 webview 加载到 100%,它仍然有很小的机会没有完全加载大声笑。因此,webview 达到 100% 后的额外 10 毫秒应该是最后一招。自从实施此更新以来,我的滚动位置没有重置一次。而且我没有像以前那样收到任何闪烁。在不使用自定义默认值加载 web 视图的情况下,它会尽可能快。

于 2015-02-17T04:49:19.217 回答