我在Android中有一个WebView,它为我的应用程序存储了一个对话流。
应用程序每20秒轮询一次服务器以查找任何消息并更新WebView。
每次WebView更新时,它都会滚动回到视图的顶部。
我想阻止这种情况发生,所以我尝试使用webView.pageDown(true);但这似乎总是假的。
任何帮助都会非常感激。这是代码:
webView.loadDataWithBaseURL("fake://not/needed", html, "text/html", "utf-8", "");
boolean scrolled = webView.pageDown(true);
System.out.println("Scrolled is: " + scrolled);
答案 0 :(得分:2)
我遇到了同样的问题,所以进一步调查并发现这些问题在这里:
我设法提出的唯一解决方案是创建一个处理程序,将延迟调用webView.pageDown(true)100ms,然后它可以工作。它可能需要更少或更多的时间,可能取决于Web视图组件呈现给定html所需的时间。
以下是加载和滚动的代码:
webView.loadDataWithBaseURL("fake://not/needed", html, "text/html", "utf-8", "");
mWebViewScrollHandler.removeCallbacks(mScrollWebViewTask);
mWebViewScrollHandler.postDelayed(mScrollWebViewTask, 100);
以下是处理程序的代码:
private final Handler mWebViewScrollHandler = new Handler();
private final Runnable mScrollWebViewTask = new Runnable() {
public void run() {
webView.pageDown(true);
}
};
答案 1 :(得分:0)
loadDataWithBaseURL
是异步的,因此在页面加载完成之前将执行pageDown
。这就是@ZoltanF说在执行代码之前需要等待一段时间的原因
您需要向页面加载添加侦听器,然后滚动:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
webView.pageDown(true);
}
});
希望有所帮助
答案 2 :(得分:0)
这个问题有两种方法:
不是重新加载WebView
,而是更改服务器上的网页,以便使用ajax更新自身。这样可以更好地控制行为。
在另一种方法中,使用Sean提到的事件监听器:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
webView.pageDown(true);
}
});