【发布时间】:2015-06-10 09:20:59
【问题描述】:
我想知道是否有人有可靠的方法在显示内容之前获取 webview 的高度。我以前见过这个问题的变体。以前的答案建议使用以下代码:
viewTreeObserver = webview.getViewTreeObserver();
viewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() {
int prevValue=0;
@Override
public boolean onPreDraw() {
int contentHeight = webview.getContentHeight();
Log.d("PreDraw","PreDrawCalled, Content Height: " + String.valueOf(contentHeight));
if ( contentHeight!= 0 && contentHeight==prevValue){
//Make sure the height has converged
int newPosition=(int)Math.round((webview.getContentHeight()*scrollPercent));
webview.scrollTo(0, newPosition);
webview.getViewTreeObserver().removeOnPreDrawListener(this);
}
prevValue=contentHeight;
return false;
}
});
我添加了 prevValue 变量。这个想法是检查以确保 contentHeight 的先前值与 contentHeigh 的当前值匹配,所以基本上我必须连续两次获得相同的高度。那甚至行不通。下面是 LogCat 的输出。
04-05 19:24:04.851: D/PreDraw(18633): PreDrawCalled, Content Height: 0
04-05 19:24:04.853: D/PreDraw(18633): PreDrawCalled, Content Height: 0
04-05 19:24:04.867: D/PreDraw(18633): PreDrawCalled, Content Height: 8
04-05 19:24:04.882: D/PreDraw(18633): PreDrawCalled, Content Height: 8
04-05 19:24:04.898: D/PreDraw(18633): PreDrawCalled, Content Height: 8
04-05 19:24:04.915: D/PreDraw(18633): PreDrawCalled, Content Height: 8
04-05 19:24:04.932: D/PreDraw(18633): PreDrawCalled, Content Height: 8
04-05 19:24:04.949: D/PreDraw(18633): PreDrawCalled, Content Height: 8
04-05 19:24:04.966: D/PreDraw(18633): PreDrawCalled, Content Height: 8
04-05 19:24:04.982: D/PreDraw(18633): PreDrawCalled, Content Height: 2114
LogCat 显示我连续多次获得相同的 contentHeight 值,因此我无法可靠地比较以前的值,除非我在循环中运行并输入一些标准,说明我必须得到相同的答案 10 次连续或其他,但感觉很hacky。我希望有更好的解决方案。
总体目标是在屏幕旋转以及重新启动 Activity 时保持 webview 滚动位置。我将 scrollPercent 变量存储在数据库中。
感谢您的帮助。
【问题讨论】: