我有一个包含ListView的活动。我需要在应用程序启动后立即以确定列表的高度。
每个活动的onXXX()函数我尝试调用ListView.getHight()得到零高度。
如果我在onResume()中调用它,我会得到正确的值但是只有当我从应用程序切换然后再回到它时,恕我直言,这与Android活动状态图http://developer.android.com/images/activity_lifecycle.png
相矛盾请建议。
答案 0 :(得分:0)
您无法在应用程序启动后立即以像素确定列表的高度,因为应用程序不知道那个高度应该是什么。
应用按顺序进行:
我不确定你是如何理解的,其中任何一个都能保证你对布局元素的充分测量。
普通的Android用户界面不仅仅是在特定的位置发布艺术,而且“poof”它始终处于完美的位置,因为Android UI旨在适应其运行的任何设备。它必须布局UI,平衡约束和对齐,甚至必须根据显示器的大小和像素密度选择合适的可绘制和布局。然后它必须填充你的列表视图。
在OS计算出该高度应该是什么之前,您将无法获得任何小部件的高度。这不是视图生命周期的一部分。
这是一个应该工作的地方(显示修改后的代码from this famous solution:)
final ListView tv = (ListView)findViewById(R.id.your_widget);
ViewTreeObserver vto = tv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
LayerDrawable ld = (LayerDrawable)tv.getBackground();
ld.setLayerInset(1, 0, tv.getHeight() / 2, 0, 0);
ViewTreeObserver obs = tv.getViewTreeObserver();
obs.removeGlobalOnLayoutListener(this);
}
});