Android WebView获取内容高度()不返回正确的值

时间:2013-08-14 15:31:55

标签: android scroll android-webview

我有一个要求,我在其下方显示一个带有复选框的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()))&lt; = mMinDistance)// mMinDistance在我的情况下为0

甚至在我向下滚动到页面底部之前,

就满意了。如您所见,我尝试在日志中打印每个值,并发现参数“top”有时会超过“getContentHeight”的值。

示例日志值:

  

08-14 11:28:19.401:I / MYACT(1075):内容身高:3020上:3861   高度:416分钟距离:0

在这种情况下,如何避免这种情况?我应该使用不同的方式来检查我是否已向下滚动到页面底部?

由于

2 个答案:

答案 0 :(得分:6)

经过一番研究后,我发现了这个问题。 Webview通常根据屏幕大小缩放网页,然后呈现它。它通常会缩放页面,使其在手机中看起来不会太小。您可以使用 getScale()

方法获得此比例因子

因此,在我的情况下,我将使用以下条件来检查是否已到达页面末尾

  

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

答案 1 :(得分:0)

如果内存服务getContentHeight()返回的值可能取决于WebView及其呈现模式(软件/硬件)的实现。但我不确定。也许Google IO上的this talk会在这个问题上为您提供更多帮助。

但一般来说,将WebView与其他视图混合起来总是很困难和棘手,特别是在滚动时。

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

作为一项规则,当我必须在那里处理WebView时,我不会将其他视图添加到活动窗口。