Android WebView的getContentHeight()方法返回的值不正确。

5

我有一个需求,需要显示一个带有复选框的WebView。该复选框最初处于禁用状态。只有当用户向下滚动到WebView的底部时,复选框才会启用。为了实现这一点,我通过扩展Webview类并编写自己的onScrollChanged监听器来完成:

@Override
protected void onScrollChanged(int left, int top, int oldLeft, int oldTop) {
     if ( (getContentHeight() - (top + getHeight())) <= mMinDistance )
     {
         Log.i("MYACT","content height: "+getContentHeight()+" top: "+top+" Height: "+getHeight()+" minDistance: "+mMinDistance);
         Log.i("MYACT", "Reached bottom");
         mOnBottomReachedListener.onBottomReached(this);
     }
     else{
         Log.i("MYACT","content height: "+getContentHeight()+" top: "+top+" Height: "+getHeight()+" minDistance: "+mMinDistance);
         Log.i("MYACT", "Not at bottom");
         mOnBottomReachedListener.onNotAtBottom(this);
     }
     super.onScrollChanged(left, top, oldLeft, oldTop);
}

问题在于条件
```(getContentHeight() - (top + getHeight())) <= mMinDistance) //mMinDistance在我的情况下是0```
甚至在我滚动到页面底部之前就已经满足了。正如你看到的,我尝试在日志中打印每个值,并发现参数"top"有时会超过值"getContentHeight"
样本日志值:
```08-14 11:28:19.401: I/MYACT(1075): content height: 3020 top: 3861 Height: 416 minDistance: 0```
在这种情况下,我该如何避免这种情况?我应该使用不同的方法来检查是否已经滚动到页面底部吗?
谢谢。
2个回答

7
经过一番研究,我找到了此问题的原因。Webview通常根据屏幕大小缩放网页并进行渲染。通常会缩放页面,以使其在手机上看起来不会太小。您可以使用方法getScale()获取此缩放因子。
因此,在我的情况下,我将使用以下条件来检查是否已达到页面末尾:

(getContentHeight()*getScale() - (top + getHeight())) <= mMinDistance) //mMinDistance在我的情况下为0


getScale()已被弃用。要获取页面高度,您必须通过js进行操作。您可以使用view.loadUrl("javascript:" + js)在页面上调用js,并通过向设置添加javascript接口来读取结果。无需修改网站。 - movAX13h

0

如果我没记错的话,getContentHeight() 返回的值可能取决于 WebView 的实现和其渲染模式(软件/硬件)。但我不确定。也许 Google IO 上的 this talk 会更有帮助。

但一般来说,将 WebView 与其他视图混合使用总是很困难和棘手的,特别是涉及到滚动时。

因此,我的建议是将复选框放入由 WebView 显示的 HTML 中。你有很多选择,比如在传递给 loadData() 方法之前注入一些额外的 HTML 代码,或者使用 loadUrl("javascript:whatever();") 调用 JavaScript,它可以修改初始 DOM 结构。

通常情况下,当我必须在 Activity 窗口中处理 WebView 时,我不会将其他视图放入其中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接