Установить высоту на Custom ViewGroup
У меня есть обычай Linearlayout
это объединяет некоторые взгляды вместе. я хочу этот Linearlayout
быть wrap_content
для высоты. Я попытался добавить параметры макета в Custrucor, как это
LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
setLayoutParams(params);
но это не имеет никакого эффекта. высота все еще match_parent
, Я также пытался вычислить высоту в onMeasure
в зависимости от роста детей, как это
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
measureChildren(widthMeasureSpec,heightMeasureSpec);
int size = 0;
for(int i = 0; i <getChildCount();i++) {
size += getChildAt(i).getMeasuredHeight();
}
int height = resolveSize(size,heightMeasureSpec);
setMeasuredDimension(widthMeasureSpec,height);
}
Это также не имеет никакого эффекта. Так в чем же проблема?
2 ответа
Предполагая ваш LinearLayout
подкласс организует представления по вертикали, этот код, который переопределяет onMeasure
Метод должен работать:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int containerWidth = MeasureSpec.getSize(widthMeasureSpec);
final int containerHeight = MeasureSpec.getSize(heightMeasureSpec);
final int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(containerWidth, MeasureSpec.EXACTLY);
final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(containerHeight, MeasureSpec.UNSPECIFIED);
View child;
int totalChildHeight = 0;
for (int i = 0; i < getChildCount(); i++) {
child = getChildAt(i);
if (child == null || child.getVisibility() == View.GONE)
continue;
measureChildWithMargins(child, childWidthMeasureSpec, 0, childHeightMeasureSpec, totalChildHeight);
totalChildHeight += child.getMeasuredHeight();
}
setMeasuredDimension(containerWidth, totalChildHeight);
}
Имейте в виду, что это по существу отменяет LinearLayout's
логика измерений. Хотя этот код в значительной степени делает то же самое, за исключением более явного способа, он также полностью игнорирует weights
дано детям, и так, если вам требуется weights
Возможно, вам придется применить больше логики здесь.
Кроме того, я должен отметить, что эта логика измерения предполагает, что дополнения не существует. Если у вас есть отступы, вы должны инициализировать totalChildHeight
в bottomPadding
+ topPadding
,
Привет, в методе onMeasure вы должны добавить это после вычисления общей высоты, необходимой для использования makeMeasureSpec, как указано ниже:
heightMeasureSpec = MeasureSpec.makeMeasureSpec (heightRequired, MeasureSpec.EXACTLY);
setMeasuredDimension (widthMeasureSpec, heightMeasureSpec);
Это работает для меня...