3

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

3 回答 3

2

我有同样的问题,所以进一步调查并发现这些相关:

我设法想出的唯一解决方案是创建一个处理程序,它将对 webView.pageDown(true) 的调用延迟 100 毫秒,然后它就可以工作了。它可能需要更少或更多的时间,可能取决于 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);
    }
};
于 2012-08-26T20:11:08.953 回答
0

loadDataWithBaseURL是异步的,因此pageDown将在页面完成加载之前执行。这就是为什么@ZoltanF 说它需要等待一段时间才能执行代码

您需要在页面加载中添加侦听器,然后进行滚动:

webView.setWebViewClient(new WebViewClient() {
    @Override  
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        webView.pageDown(true);
    }  
});

希望能帮助到你

于 2013-07-19T06:59:20.710 回答
0

这个问题有两种方法:

不要重新加载WebView,而是更改服务器上的网页,以便它使用 ajax 进行自我更新。这将对行为进行更多控制。

在另一种方法上,使用 Sean 提到的事件侦听器:

webView.setWebViewClient(new WebViewClient() {
    @Override  
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        webView.pageDown(true);
    }  
});
于 2016-05-29T09:59:25.297 回答