如何在启动时获取小部件高度

时间:2013-05-06 21:57:31

标签: android android-widget android-listview

我有一个包含ListView的活动。我需要在应用程序启动后立即以确定列表的高度

每个活动的onXXX()函数我尝试调用ListView.getHight()得到零高度。

如果我在onResume()中调用它,我会得到正确的值但是只有当我从应用程序切换然后再回到它时,恕我直言,这与Android活动状态图http://developer.android.com/images/activity_lifecycle.png

相矛盾

请建议。

1 个答案:

答案 0 :(得分:0)

您无法在应用程序启动后立即以像素确定列表的高度,因为应用程序不知道那个高度应该是什么。

应用按顺序进行:

  • 启动活动
  • 的onCreate()
  • 在onStart()
  • 的onResume()
  • 活动正在运行

我不确定你是如何理解的,其中任何一个都能保证你对布局元素的充分测量。

普通的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);
    }

});