gpt4 book ai didi

Android WebView 报告不正确的内容高度

转载 作者:行者123 更新时间:2023-12-05 07:44:49 25 4
gpt4 key购买 nike

我正在开发一个应该加载网页的 Android 应用程序,如果内容高度大于 View 高度,则滚动内容。

问题是在几个页面上,似乎 WebView.getContentHeight() 返回 View 的确切高度,即使我可以手动向下滚动也是如此。这意味着我没有动画师的正确值,并且滚动无法正常工作。

目前,为了测试这个问题,我设置了一个滚动更改监听器,以便在 WebView 滚动到末尾时记录一条消息。

        webView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
@Override
public void onScrollChange(View view, int i, int i1, int i2, int i3) {
Log.d(TAG, String.format("scrollX: %d, scrollY: %d, oldScrollX: %d, oldScrollY: %d", i, i1, i2, i3));
int height = (int) Math.floor(webView.getContentHeight() * webView.getScaleY());
if (webView.getScrollY() + webView.getHeight() >= height && progress > 99)
Log.d(TAG, "Reached bottom: " + height);
}
});

日志显示缩放后的内容高度为 1586,网页 View 高度为 1586。但是,我可以手动向下滚动页面,并得到以下日志输出:

WebPageView: scrollX: 0, scrollY: 1960, oldScrollX: 0, oldScrollY: 1774
WebPageView: Reached bottom: 1773
WebPageView: scrollX: 0, scrollY: 1959, oldScrollX: 0, oldScrollY: 1960
WebPageView: Reached bottom: 1773

对我来说,这清楚地表明内容高度被误报了,如:

WebView.getScrollY() + WebView.getHeight() > WebView.getContentHeight() * WebView.getScaleY()

我也设置了一个 WebChromeClient,并重载了 onProgressChanged(),我知道当检索内容高度时,页面加载完成。

什么可能导致 WebView 将内容高度误报为一页,而实际上它确实大得多?

编辑:我已在 Android 6.0、7.0 和 7.1 上运行该应用程序。 build.gradle中的minSdkVersion为23,targetSdkVersion为25,WebView版本为44.0.2403.119。

最佳答案

更新:正如评论中所指出的,computeVerticalScrollRange() 是一种 protected 方法,因此您必须子类化 WebView 才能使这种方法起作用。这可以通过将监听器放在子类中或创建访问器方法以返回 protected 方法的值来实现。


不要使用 getContentHeight(),请尝试使用 computeVerticalScrollRange()

滚动值以任意单位表示,但它们在所有返回或使用滚动值的不同方法中是一致的。因此,虽然内容高度可能以像素为单位,但滚动单位不是。您希望更新您的代码以准确检测滚动到底部。

在 Java 中:

webView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
@Override
public void onScrollChange(View view, int i, int i1, int i2, int i3) {
int maxScrollRange = computeVerticalScrollRange();
if (webView.getScrollY() + webView.getMeasuredHeight() >= maxScrollRange) {
Log.d(TAG, "Reached the bottom.");
}
}
});

或者在 Kotlin 中:

webView.setOnScrollChangeListener { _,_,_,_,_ ->
val maxScrollRange = computeVerticalScrollRange()
if(webView.scrollY + webView.measuredHeight >= maxScrollRange) {
Log.d(TAG, "Reached the bottom.")
}
}

关于Android WebView 报告不正确的内容高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42564450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com