'onMeasure () `имеет некоторые правила , которым вы не строго следуете.Я видел, как эти правила нарушались безнаказанно, но я думаю, что вас поймали, но мы будем настаивать.
В onMeasure()
вы устанавливаете высоту и ширину пользовательского макета, но ConstraintLayout
все ещепонимает макет как wrap_content
.Вам нужно будет установить параметры макета на новую высоту и ширину.Добавьте следующий код в конец onMeasure()
:
// Although we have measured the layout, we need to tell ConstraintLayout in the
// LayoutParams that the size is not longer "wrap_content".
ViewGroup.LayoutParams lp = getLayoutParams();
lp.width = width;
lp.height = height;
setLayoutParams(lp);
Вторая проблема, с которой вы столкнулись, заключается в том, что вы добавляете ConstraintLayout
(card.xml) к ConstraintLayout
(ваш пользовательский макет).), но вы не устанавливаете ограничения.В конструкторе для Card.java
добавьте следующее, чтобы установить ограничения:
ConstraintLayout layout = (ConstraintLayout) inflate(context, R.layout.card, this);
// We have added R.layout.card to a ConstraintLayout (this custom layout), so we need
// to make sure that it is constrained properly.
ConstraintSet cs = new ConstraintSet();
cs.clone(layout);
cs.connect(R.id.layout, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START);
cs.connect(R.id.layout, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP);
cs.connect(R.id.layout, ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END);
cs.connect(R.id.layout, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM);
cs.applyTo(layout);
Вам потребуется изменить высоту и ширину макета в card.xml
на 0dp
.match_parent
никогда не подходит в ConstraintLayout
.
Это наглядное описание происходящего:
НаВ связи с этим, вам следует рассмотреть возможность использования слияния , чтобы избежать вложенности ConstraintLayouts
, как уже упоминалось.