自定义LinearLayout - 子项不可见

时间:2017-07-14 07:26:07

标签: android android-layout android-custom-view

我构建了扩展LinearLayout的customView并拥有简单的3个子项(2个TextView和ImageView)。我在代码中动态创建此视图并将其添加到父LinearLayout。此视图具有背景,因此我可以轻松地在屏幕上看到它在其位置正确充气,但任何一个孩子都不可见。我检查了LayoutInspector,它显示所有内容都已正确设置(文本值为TextViews,图片为ImageView),但不知何故,当我尝试在检查器上找到它们时,它们在我的customView上显示为小点:

enter image description here

我的CustomView被称为DayTileView,这是灰色背景的正方形。正如你在左侧检查员看到的那样,孩子们充满了内容。视图布局:

 <layout xmlns:android="http://schemas.android.com/apk/res/android">
    <merge>
        <TextView
                android:id="@+id/day"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:textColor="@android:color/white"
        />

    <TextView
            android:id="@+id/dayName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:textColor="@android:color/white"
    />

    <ImageView
            android:id="@+id/padlock"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:src="@drawable/ic_padlock"
    />
</merge>
</layout>

及其代码:

public class DayTileView extends LinearLayout {
private DayTileBinding mBinding;

public DayTileView(Context context) {
    super(context);
    init();
}

public DayTileView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    init();
}

public DayTileView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

private void init() {
    mBinding = DataBindingUtil.inflate(LayoutInflater.from(getContext()), R.layout.day_tile, this, true);
    setOrientation(VERTICAL);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    final int width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
    setMeasuredDimension(width, width);
}

public void setDay(int day, int month, int year) {
    DateTime settedDay = new DateTime().withYear(year).withMonthOfYear(month).withDayOfMonth(day);
    mBinding.day.setText(String.valueOf(day));
    String dayName = settedDay.dayOfWeek().getAsText();
    mBinding.dayName.setText(dayName);
    boolean isWeekend = settedDay.dayOfWeek().get() == 6 || settedDay.dayOfWeek().get() == 7;
    setBackgroundColor(ContextCompat.getColor(getContext(), isWeekend ? R.color.weekend_bg : R.color.weekday_bg));
}

}

它在另一个CustomView中使用,也是LinearLayout但是水平方向(检查器上的PlannedDayView):

<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <merge>

        <*.customViews.DayTileView
                android:id="@+id/dayTile"
                android:layout_width="0dp"
                android:layout_weight="0.2"
                android:layout_height="wrap_content"/>

        <LinearLayout
                android:id="@+id/container"
                android:orientation="vertical"
                android:layout_weight="1.2"
                android:layout_width="0dp"
                android:layout_height="wrap_content"/>

    </merge>
</layout>

有没有人知道什么可以招致这个(孩子们不在视野范围内)?当我将LinearLayout的合并替换为垂直方向和相同的背景时,布局的设计模式中的所有内容都可以正确显示,因此它应该可以工作。

编辑: 我发现,如果我在View initalization Padding Top中设置为10px,那么dot就会向下移动。因此,从某些原因看,Android没有正确地将TextViews和ImageView充气

1 个答案:

答案 0 :(得分:0)

我发现了什么问题: 我压倒了测量,并没有衡量儿童观点。之前我使用这样的代码使方形视图不是方形ViewGroup。

更正后的代码:

 final int width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
    setMeasuredDimension(width, width);
    super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY));

为View设置正确的宽度和高度后,我必须使用新的MeasureSpec

测量整个视图