Подтвердить что ты не робот

Почему обертывание содержимого в несколько строк TextView заполняет родительский?

У меня есть многострочный текстовый вид, установленный на android:layout_width="wrap_content", который при визуализации принимает всю доступную ширину родителя. Когда текст может вписываться в одну строку, wrap_content работает отлично, но в двух или более строках текстовое представление, похоже, соответствует ширине родителей, оставляя на обеих сторонах все, что похоже на дополнение.

Поскольку текст не может быть помещен в одну строку, подразумевается ли текстовое представление, требующее всей доступной ширины? Я хочу, чтобы представление было ограничено наименьшими возможными размерами.

Любые идеи?

Для справки, вот определение макета:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:singleLine="false"
    android:textSize="24sp"
    android:textStyle="bold"
    android:textColor="@color/white"
    android:gravity="center_horizontal"
/>
4b9b3361

Ответ 1

У меня была такая же проблема... Вы можете использовать пользовательский TextView с переопределенным методом onMeasure(), где вы вычисляете ширину:

public class WrapWidthTextView extends TextView {

...

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    Layout layout = getLayout();
    if (layout != null) {
        int width = (int) Math.ceil(getMaxLineWidth(layout))
                + getCompoundPaddingLeft() + getCompoundPaddingRight();
        int height = getMeasuredHeight();            
        setMeasuredDimension(width, height);
    }
}

private float getMaxLineWidth(Layout layout) {
    float max_width = 0.0f;
    int lines = layout.getLineCount();
    for (int i = 0; i < lines; i++) {
        if (layout.getLineWidth(i) > max_width) {
            max_width = layout.getLineWidth(i);
        }
    }
    return max_width;
}
}

Ответ 2

Немного оптимизированное решение для принятого ответа выше:

@Override
protected void onMeasure(int widthSpec, int heightSpec) {
    int widthMode = MeasureSpec.getMode(widthSpec);

    // if wrap_content 
    if (widthMode == MeasureSpec.AT_MOST) {
        Layout layout = getLayout();
        if (layout != null) {
            int maxWidth = (int) Math.ceil(getMaxLineWidth(layout)) + 
                           getCompoundPaddingLeft() + getCompoundPaddingRight();
            widthSpec = MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST);
        }
    }
    super.onMeasure(widthSpec, heightSpec);
}