webView scrollTo不能一直工作

时间:2015-02-15 04:04:45

标签: java android webview scrollto postdelayed

我目前在使用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);
            }
        }

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

现在这是问题,当我使用view.getScrollX()&gt; 0确定是否已加载webview,它工作正常。但有时候,view.getScrollX()&gt; 0将评估为true。但是当我使用webview scrollTo函数时,我的ScrollX和ScrollY变量在scrollTo之前被重置,或者在scrollTo使用期间,webview只返回到0,0。怎么回事?

1 个答案:

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

现在这段代码是一种美。 Soooo,我正在检查webview进度是否达到了100%,如果没有,我会回到runnable。然后,当我的webview被100%加载时,我添加了一个postDelayed,因为即使webview加载了100%,它仍然有很小的机会没有被完全加载lol。因此webview后100ms的额外10ms应该是最后的技巧。自实施此更新以来,我没有重置一次滚动位置。而且我也没有接受过和以前一样多的闪烁。它的速度与没有使用自定义默认值的webview加载一样快。