我创建了一个扩展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
有效?
答案 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
widthMeasureSpec
和heightMeasureSpec
值不仅是View
的宽度和高度。在这种情况下,将这些值传递给setMeasureDimension
是完全错误的,因为此方法实际上需要实际大小作为参数。