wrap_content不适用于自定义RelativeLayout

时间:2014-08-05 15:43:18

标签: android android-layout

我创建了一个扩展RelativeLayout的自定义布局。目前,除了覆盖onMeasure方法(稍后我将需要)之外,此布局不执行任何操作。这是我的代码:

public class CustomLayout extends RelativeLayout {

    public CustomLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

我有以下布局文件:

   <LinearLayout
        android:id="@+id/containerLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="false"
        android:orientation="horizontal" >

        <...CustomLayout
            android:id="@+id/item"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="50"
            android:background="#fff" >

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Hello"
                android:textSize="20sp" />

        </...CustomLayout>

        <RelativeLayout
            android:id="@+id/controls"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="50"
            android:background="#0f0" >
        </RelativeLayout>
    </LinearLayout>

问题是高度为空。在我的调试过程中,我注意到如果我将CustomLayout更改为RelativeLayout则可以正常工作。

因此,很明显问题来自我的CustomLayout,但我需要添加什么来使wrap_content有效?

1 个答案:

答案 0 :(得分:0)

我终于找到了问题。我改变了这个:

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

对此:

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

它运作正常。

<强>解释

首先,以下行没用:

setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);

但为什么它会使View的高度为空?

事实上,我误解了onMeasure方法的参数。它们是MeasureSpec值。以下是Google对此对象的评论:

  

MeasureSpec封装了从父级传递的布局要求   对孩子每个MeasureSpec代表要求   宽度或高度。 MeasureSpec由大小和模式组成。   有三种可能的模式:

     

缺席父母没有对孩子施加任何限制。它   可以是它想要的任何尺寸。确切地说,父母确定了一个   确切的大小。孩子将被给予那些界限   不管它想要多大。 AT_MOST孩子可以如此   因为它想要达到指定的大小。 MeasureSpecs是   实现为int以减少对象分配。这堂课是   提供将元组打包并解压缩到int

widthMeasureSpecheightMeasureSpec值不仅是View的宽度和高度。在这种情况下,将这些值传递给setMeasureDimension是完全错误的,因为此方法实际上需要实际大小作为参数。