pageDown(true)总是在WebView Android中返回false

时间:2012-04-06 17:45:56

标签: android webview

我在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);

3 个答案:

答案 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);
    }  
});