2014-03-29 60 views
2

我在onPageFinished函数中调用webview.scrollTo,但它什么都不做。android webview.scrollTo不工作

public void onPageFinished(WebView view, String url) 
    { 
     // TODO Auto-generated method stub 
     super.onPageFinished(view, url); 
     webview.scrollTo(0, scrollY); 
    } 

任何想法为什么? 如何在加载完成后自动滚动页面?

回答

7

在我看来,在完成onPageFinished,onProgressChanged,WebView.scrollTo和网页的显示(实际绘制到屏幕)之间存在竞态条件。

页面显示后,WebView'认为'它已滚动到您的scrollY位置。

要测试,您可以验证WebView.getScrollY()是否返回所需内容,但是页面的显示不在该位置。

要解决这个问题,这里是一个非确定性的方法在页面呈现后立即滚动到Y:

... 
    webView = (WebView) view.findViewById(R.id.web_view_id); 
    webView.loadData(htmlToDisplay, "text/html; charset=UTF-8", null); 
    ... 
    webView.setWebViewClient(new WebViewClient() 
    { ... }); 
    webView.setWebChromeClient(new WebChromeClient() 
    { 
     ... 

     @Override 
     public void onProgressChanged(WebView view, int progress) { 
      ... 
      if (view.getProgress()==100) { 
       // I save Y w/in Bundle so orientation changes [in addition to 
       // initial loads] will reposition to last location 
       jumpToY(savedYLocation); 
      } 
     } 

    }); 

    ... 

    private void jumpToY (int yLocation) { 
     webView.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       webView.scrollTo(0, yLocation); 
      } 
     }, 300); 
    } 

的300毫秒的最后一个参数似乎让系统“追赶”在jumpToY被调用之前。根据这个平台的运行情况,你可能会玩这个价值。

希望这有助于

-Mike

+0

哇!迈克,你的回答解决了我很长时间以来的一个问题。如果我能我给你100分。非常感谢你! Refael – rafraph

+0

这是我的荣幸:)有关存储先前的位置W /在捆绑的提示也将支持由于方向变化 - 奖金重新加载。 –