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