Установить высоту на 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);

Это работает для меня...

Другие вопросы по тегам