我正在尝试以编程方式将WebView滚动到DOM树中特定元素的位置。但到目前为止,我还没有能够让WebView响应滚动请求。我试过调用使用window.scrollTo(...)
的JavaScript,但WebView没有响应。在Java方面,我尝试调用WebView.flingScroll(...)
方法。 WebView将响应flingScroll
,但我需要的是scrollTo(...)
功能。有什么想法吗?
答案 0 :(得分:47)
我找到了一个更好的答案来解决这个问题。事实证明,WebView
确实有scrollTo()
,getScrollX()
和getScrollY()
方法,正如您所期望的那样。它们在文档中有点隐藏,因为它们是继承自View
(通过AbsoluteLayout
- > ViewGroup
- > View
)。这显然是一种操纵WebView
滚动位置的更好方法,而不是有点麻烦的JavaScript界面。
答案 1 :(得分:13)
事实证明,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的当前滚动位置(请参阅window.pageXOffset
,window.pageYOffset
或window.scrollX
,window.scrollY)
。如果您只是想知道WebView的当前滚动位置,编写一些JavaScript来调用Java代码并传递X / Y偏移量。
答案 2 :(得分:0)
您不能使用Java代码。
对于那些坚持这个问题的人,我对在Android中滚动webview有一些结论。
window.scrollTo(100,500)
考虑您的情况并选择合适的解决方案。还要注意的是,投掷和滚动是不同的事情。
答案 3 :(得分: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);
}
答案 4 :(得分:0)
以下单行解决方案确保所选元素出现在视图中(如果未显示)。在某些情况下这可能就足够了。
webView.loadUrl("javascript:document.getElementById('"+aID+"').scrollIntoView()");