在我看来,在完成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
哇!迈克,你的回答解决了我很长时间以来的一个问题。如果我能我给你100分。非常感谢你! Refael – rafraph
这是我的荣幸:)有关存储先前的位置W /在捆绑的提示也将支持由于方向变化 - 奖金重新加载。 –