0

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

     <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:gravity="center">
        <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/group_bg"
            android:gravity="center_vertical" 
            android:baselineAligned="false">
            <LinearLayout
                android:id="@+id/itemplace"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginRight="5dp"
                android:layout_weight="1" >
                <include
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    layout="@layout/pin" />
            </LinearLayout>
            <FrameLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/arrow_black"/>
        </LinearLayout>
    </LinearLayout>

在绘制此层次结构之前,我需要获取 itemplace 宽度。我无法使用 OnLayoutChangeListener,因为我使用的是 API 级别 7。

我知道我必须使用 measure() 和 layout() 方法来计算视图的大小,但我不知道该怎么做。

我的层次结构中的根视图必须填满屏幕的所有宽度,因此 itemplace 宽度取决于父大小、父填充和 FrameLayout 宽度。

我必须怎么做才能让它变宽?

4

2 回答 2

2

我已经找到了获取视图宽度的方法。我可以在 android 测量它之后但在 ViewTreeObserver 中使用 OnPreDrawListener 绘制之前得到它:

    view.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener()
    {
        @Override
        public boolean onPreDraw()
        {
            int avaliableWidth = view.getWidth() - view.getPaddingLeft() - view.getPaddingRight();

            Log.d("width", String.valueOf(avaliableWidth));

            return true;
        }
    });

来自 Android 文档:

即将绘制视图树时调用的回调方法。此时,树中的所有视图都已被测量并给出了一个框架。客户可以使用它来调整他们的滚动范围,甚至在绘制之前请求一个新的布局。

于 2012-07-11T06:07:24.613 回答
0

这从 API 1 开始可用:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
    int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
}
于 2012-07-11T06:25:12.840 回答