我有一个带有 ListView 的活动。我需要在应用程序启动后立即确定列表的高度(以像素为单位) 。
每个活动的 onXXX() 函数我都尝试调用 ListView.getHight() 在我得到零高度。
如果我在 onResume() 中调用它,我会得到正确的值,但前提是我从应用程序切换然后返回到它,恕我直言,这与 Android 活动状态图http://developer.android.com/images/相矛盾活动生命周期.png
请指教。
我有一个带有 ListView 的活动。我需要在应用程序启动后立即确定列表的高度(以像素为单位) 。
每个活动的 onXXX() 函数我都尝试调用 ListView.getHight() 在我得到零高度。
如果我在 onResume() 中调用它,我会得到正确的值,但前提是我从应用程序切换然后返回到它,恕我直言,这与 Android 活动状态图http://developer.android.com/images/相矛盾活动生命周期.png
请指教。
您无法在应用程序启动后立即确定列表的高度(以像素为单位),因为应用程序不知道该高度应该是多少。
该应用程序按顺序运行:
我不确定您如何解释其中任何一个都可以保证您对布局元素进行充分测量。
常见的 Android UI 不只是将艺术作品放在特定的位置,并且“噗”地总是在完美的位置,因为 Android UI 旨在适应它运行的任何设备。它必须布局 UI,平衡约束和对齐,甚至必须根据显示的大小和像素密度选择适当的可绘制对象和布局。然后它必须填充您的列表视图。
在操作系统计算出该高度应该是多少之前,您将无法获得任何小部件的高度。这不是视图生命周期的一部分。
这是一个应该工作的地方(显示这个著名解决方案的修改代码:)
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);
}
});