我正在尝试以编程方式将 WebView 滚动到 DOM 树中特定元素的位置。但到目前为止,我还无法让 WebView 响应滚动请求。我尝试调用使用 的 JavaScript window.scrollTo(...)
,但 WebView 没有响应。在 Java 方面,我尝试调用该WebView.flingScroll(...)
方法。WebView 会响应flingScroll
,但我需要的是一种scrollTo(...)
能力。有任何想法吗?
5 回答
对于这个问题,我找到了更好的答案。事实证明,它WebView
确实具有scrollTo()
,getScrollX()
和getScrollY()
方法,正如您所期望的那样。它们在文档中有点隐藏,因为它们是从View
(通过AbsoluteLayout
-> ViewGroup
-> View
)继承的。这显然是一种WebView
比有些繁琐的 JavaScript 界面更好的方式来操纵 的滚动位置。
事实证明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);
}
以下单行解决方案可确保将所选元素带入视野(如果不是)。在某些情况下,这可能就足够了。
webView.loadUrl("javascript:document.getElementById('"+aID+"').scrollIntoView()");
您无法使用 Java Code 做到这一点。
对于所有被这个问题困扰的人,我对在 android 中滚动 webview 有一些结论。
- 您无法使用 Java 代码滚动 web 视图或获取滚动位置。
- 只能获取webview的layoutHeight、measuredHeight、contentHeight,仅此而已。这些都是允许您获取和设置滚动状态的 android api。
- 但是,您可以覆盖 onScorllChanged 以添加自定义监听器用于滚动 webview 事件(或 fling 事件),您将被通知原始位置和新位置。
- 好吧,您可以使用 JavaScript 代码滚动到某个位置,如下所示,但性能确实很差。如果您想经常滚动它,请三思而后行。
window.scrollTo(100,500)
考虑您的情况并选择合适的解决方案。还要注意,投掷和滚动是不同的东西。