webView scrollTo 一直不工作

webView scrollTo not working all the time

我目前遇到 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 完全加载。我的 postDelayed 每 10 毫秒检查一次 webviews getScrollX() returns something > 0(意味着 webview 已加载)。如果是,它会更改代码的 webview 滚动位置部分,并最终确定 webview 已加载。如果没有,代码会在尝试设置 webviews 滚动位置后重新 运行。这样接下来,我的 if 语句可以评估为 true 并避免重新运行代码部分。

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

好吧,我意识到发生了什么。即使 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);
        }
    }

现在那段代码很漂亮。 Soooo,我正在检查 webview 进度是否已达到 100%,如果没有,我将循环回到 runnable。然后,当我的 webview 加载到 100% 时,我添加了一个 postDelayed,因为即使 webview 加载到 100%,它仍然有很小的机会没有完全加载,哈哈。因此,webview 达到 100% 后的额外 10ms 应该可以完成最后的技巧。自从实施此更新以来,我还没有重置过一次滚动位置。而且我没有收到像以前一样多的闪烁。在不使用自定义默认值加载 webview 的情况下,它会尽可能快。