【问题标题】:When do we know when an Activity's views have been layed out我们何时知道 Activity 的视图何时布局
【发布时间】:2012-04-16 16:46:51
【问题描述】:

我有一个视图层次结构如下的 Activity:

<RelativeLayout>
    <LinearLayout>
        <GridLayout />
    </LinearLayout>
</RelativeLayout>

顶部的 RelativeLayout 占据了整个屏幕,而 LinearLayout 占据了屏幕的一个子集。我正在尝试设置 GridLayout 的子视图的大小,以便在 n 行和 m 列的情况下,单元格的大小与 n、m 值以及 LinearLayout 的宽度和高度直接相关。

例如,我试图获取单元格的宽度和高度,如下所示:

int linearLayoutWidth = mLinearLayout.getMeasuredWidth();
int linearLayoutHeight = mLinearLayout.getMeasuredHeight();
...

int rows = mGridModel.getRows() + 1;
int columns = mGridModel.getColumns() + 1;
int cellWidth = (int) (linearLayoutWidth / columns);
int cellHeight = (int) (linearLayoutHeight / rows);

不幸的是,在创建视图时,mLLinearLayout.getMeasuredWidth() 不会返回正确的大小。它总是返回实际设备的屏幕宽度,直到视图完全布局——在这种情况下为时已晚。我已经根据最初完全不正确的值给我的孩子单元格视图的大小。

我的问题是 - 我如何知道视图何时已完全布局。我需要查询它们的正确或实际测量的宽度/高度。

setContentView() 创建视图并在理论上对它们进行布局。但尚不能保证他们的视图处于最终正确的位置/大小。

【问题讨论】:

    标签: android android-layout android-activity android-view


    【解决方案1】:

    你可以将ViewObserver添加到任何视图中,在这个观察者中有一个回调方法onGlobalLayout,在布局布局时调​​用;

    ViewTreeObserver observer = view.getViewTreeObserver();
    observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            //in here, place the code that requires you to know the dimensions.
    
    
             //this will be called as the layout is finished, prior to displaying.
        }
    }
    

    【讨论】:

    • 对我来说似乎并不不幸 - 这似乎是一种了解布局正在做什么的优雅方式。
    • 是的,这是一种了解布局正在做什么的优雅方式。
    • Activity 上的 onLayoutSet 方法将是一种更优雅的方式。
    【解决方案2】:

    扩展 jeet 的答案,您可以让您的活动实现侦听器,这会导致代码稍微好一些。

    public class MyActivity extends Activity implements ViewTreeObserver.OnGlobalLayoutListener {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...
            view.getViewTreeObserver().addOnGlobalLayoutListener(this);
        }
    
        @Override
        public void onGlobalLayout() {
            ...
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 2012-01-15
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多