web-dev-qa-db-ja.com

プログラムでスクロールする方法Android WebView

プログラムでWebViewをスクロールして、DOMツリー内の特定の要素の場所に移動しようとしています。しかし、これまでのところ、WebViewにスクロール要求に応答させることができていません。 window.scrollTo(...)を使用するJavaScriptを呼び出してみましたが、WebViewが応答しません。 Java側で、WebView.flingScroll(...)メソッドを呼び出してみました。WebViewはflingScrollに応答しますが、必要なのはscrollTo(...)機能。アイデアはありますか?

29
Steve Liddle

私はこの問題に対するより良い答えを見つけました。 WebViewには、期待どおりにscrollTo()getScrollX()getScrollY()メソッドがあることがわかります。これらはViewから継承されているため、ドキュメントでは少し隠されています(AbsoluteLayout-> ViewGroup-> Viewを介して)。これは明らかに、やや面倒なJavaScriptインターフェースよりもWebViewのスクロール位置を操作するための優れた方法です。

47
Steve Liddle

window.scrollTo()は機能することがわかりました。scrollTo()という名前の独自のメソッドを追加することはできません。何らかの理由で、私がscrollTo()を呼び出したときに、独自のwindow.scrollTo()メソッドが呼び出されていました。

したがって、要約すると、WebViewを特定のDOM要素にスクロールするには、JavaScript関数を記述してスクロールします。

function scrollToElement(id) {
    var elem = document.getElementById(id);
    var x = 0;
    var y = 0;

    while (elem != null) {
        x += elem.offsetLeft;
        y += elem.offsetTop;
        elem = elem.offsetParent;
    }
    window.scrollTo(x, y);
}

次に、Androidアプリ(Javaコード)から、WebViewにURLをロードするように指示します。

webView.loadUrl("javascript:scrollToElement('" + elemId + "')");

このアプローチには、スクロールがうまくアニメーション化されないなどの一般的なメカニズムは機能するなど、いくつかの問題があります。

DOMウィンドウオブジェクトは、WebViewの現在のスクロール位置を正しく報告します(window.pageXOffsetwindow.pageYOffsetまたはwindow.scrollXwindow.scrollY)。 WebViewの現在のスクロール位置だけを知りたい場合は、JavaScriptを記述してJavaコードを呼び出し、X/Yオフセットに沿って渡します。

13
Steve Liddle
    @Override
        public void onPageFinished(final WebView view, String url) {

            super.onPageFinished(view, url);

                new Handler().postDelayed(new Runnable() {

                        @Override
                        public void run() {
                                if (app.scrollCache.containsKey(app.srctid))
            {
                            app.scrollSpot=app.scrollCache.get(app.srctid); 
                            view.scrollTo(0,(int)app.scrollSpot);
                            }
                        pageFinished=true;
                        }
                    }, 200);


    }
0
irshst

Javaコードを使用してそれを行うことはできません。

この問題で立ち往生しているすべての人のために、私はAndroidでWebビューをスクロールすることについていくつかの結論を出します。

  • Javaコードを使用してWebビューをスクロールしたり、スクロール位置を取得したりすることはできません。
  • WebViewのlayoutHeight、measuredHeight、contentHeightのみを取得できます。これらはすべてAndroid apiで、スクロールステータスの取得と設定を行うことができます。
  • ただし、onScorllChangedをオーバーライドして、Webviewイベント(またはflingイベント)をスクロールするための自己定義リスナーを追加できます。Originの位置と新しい位置が通知されます。
  • 次のように、JavaScriptコードを使用して位置までスクロールできますが、パフォーマンスは非常に低くなります。頻繁にスクロールしたい場合は、もう一度考えてみてください。

    window.scrollTo(100,500)

状況を考慮し、適切なソリューションを選択してください。フリングとスクロールは異なるものであることにも注意してください。

0
York