我有一个要求,我在其下方显示一个带有复选框的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
在这种情况下,如何避免这种情况?我应该使用不同的方式来检查我是否已向下滚动到页面底部?
由于
答案 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
时,我不会将其他视图添加到活动窗口。