30

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

4

5 に答える 5

51

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

于 2010-02-19T07:12:57.107 に答える
12

window.scrollTo()DOESが機能することがわかりました。という名前の独自のメソッドを追加することはできません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の現在のスクロール位置を正しく報告します(、、または、を参照してください。WebViewwindow.pageXOffsetwindow.pageYOffset現在window.scrollXwindow.scrollY)スクロール位置を知りたいだけの場合は、JavaScriptを記述してJavaコードを呼び出し、X/Yオフセットを渡します。 。

于 2010-02-10T18:19:34.563 に答える
0

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

この問題で立ち往生しているすべての人のために、私はアンドロイドでウェブビューをスクロールすることについていくつかの結論を持っています。

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

    window.scrollTo(100,500)

あなたの状況を考慮し、適切な解決策を選択してください。また、フリングとスクロールは別のものであることに注意してください。

于 2015-10-26T09:04:46.790 に答える
0
    @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);


    }
于 2016-04-08T16:39:21.040 に答える
0

次の1行のソリューションでは、選択した要素が表示されていない場合でも表示されます。状況によってはこれで十分かもしれません。

webView.loadUrl("javascript:document.getElementById('"+aID+"').scrollIntoView()");
于 2020-10-25T10:48:19.490 に答える