プログラムでWebViewをDOMツリー内の特定の要素の場所にスクロールしようとしています。しかし、これまでのところ、WebViewにスクロール要求に応答させることはできませんでした。を使用するJavaScriptを呼び出そうとしましwindow.scrollTo(...)
たが、WebViewが応答しません。Java側では、WebView.flingScroll(...)
メソッドを呼び出してみました。WebViewはに応答しflingScroll
ますが、必要なのはscrollTo(...)
機能です。何か案は?
5 に答える
私はこの問題に対するより良い答えを見つけました。あなたが期待するように、そしてメソッドをWebView
持っていることがわかります。それらは( -> ->を介して)継承されているため、ドキュメントには少し隠されています。これは明らかに、やや面倒なJavaScriptインターフェイスよりもスクロール位置を操作するためのより良い方法です。scrollTo()
getScrollX()
getScrollY()
View
AbsoluteLayout
ViewGroup
View
WebView
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.pageXOffset
のwindow.pageYOffset
現在window.scrollX
のwindow.scrollY)
スクロール位置を知りたいだけの場合は、JavaScriptを記述してJavaコードを呼び出し、X/Yオフセットを渡します。 。
Javaコードを使用してそれを行うことはできません。
この問題で立ち往生しているすべての人のために、私はアンドロイドでウェブビューをスクロールすることについていくつかの結論を持っています。
- Javaコードを使用してWebビューをスクロールしたり、スクロール位置を取得したりすることはできません。
- WebビューのlayoutHeight、measuredHeight、contentHeightのみを取得でき、それ以上は取得できません。これらはすべて、スクロールステータスの取得と設定で実行できるAndroidAPIです。
- ただし、onScorllChangedをオーバーライドして、スクロールWebビューイベント(またはフリングイベント)の自己定義リスナーを追加することができます。原点位置と新しい位置が通知されます。
- さて、次のようなJavaScriptコードを使用して位置までスクロールできますが、パフォーマンスは非常に低くなります。頻繁にスクロールしたい場合は、考え直してください。
window.scrollTo(100,500)
あなたの状況を考慮し、適切な解決策を選択してください。また、フリングとスクロールは別のものであることに注意してください。
@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);
}
次の1行のソリューションでは、選択した要素が表示されていない場合でも表示されます。状況によってはこれで十分かもしれません。
webView.loadUrl("javascript:document.getElementById('"+aID+"').scrollIntoView()");