3

アプリケーションの会話ストリームを保存する Android の WebView があります。

アプリは 20 秒ごとにサーバーにメッセージをポーリングし、WebView を更新します。

WebView が更新されるたびに、ビューの上部にスクロールして戻ります。

これを止めたかったので、webView.pageDown(true); を使用してみました。しかし、これは常に false を返すようです。

どんな助けでも本当に感謝しています。コードは次のとおりです。

    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

この問題には 2 つのアプローチがあります。

をリロードする代わりにWebView、サーバー上の Web ページを変更して、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 に答える