プログラムでWebViewをスクロールして、DOMツリー内の特定の要素の場所に移動しようとしています。しかし、これまでのところ、WebViewにスクロール要求に応答させることができていません。 window.scrollTo(...)
を使用するJavaScriptを呼び出してみましたが、WebViewが応答しません。 Java側で、WebView.flingScroll(...)
メソッドを呼び出してみました。WebViewはflingScroll
に応答しますが、必要なのはscrollTo(...)
機能。アイデアはありますか?
私はこの問題に対するより良い答えを見つけました。 WebView
には、期待どおりにscrollTo()
、getScrollX()
、getScrollY()
メソッドがあることがわかります。これらはView
から継承されているため、ドキュメントでは少し隠されています(AbsoluteLayout
-> ViewGroup
-> View
を介して)。これは明らかに、やや面倒なJavaScriptインターフェースよりもWebView
のスクロール位置を操作するための優れた方法です。
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.pageXOffset
、window.pageYOffset
またはwindow.scrollX
、window.scrollY)
。 WebViewの現在のスクロール位置だけを知りたい場合は、JavaScriptを記述してJavaコードを呼び出し、X/Yオフセットに沿って渡します。
@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);
}
Javaコードを使用してそれを行うことはできません。
この問題で立ち往生しているすべての人のために、私はAndroidでWebビューをスクロールすることについていくつかの結論を出します。
window.scrollTo(100,500)
状況を考慮し、適切なソリューションを選択してください。フリングとスクロールは異なるものであることにも注意してください。