Почему обтекание содержимого в многострочном родительском заполнении TextView? - PullRequest
25 голосов
/ 16 сентября 2011

У меня многострочное текстовое представление, установленное на 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"
/>

Ответы [ 2 ]

48 голосов
/ 03 ноября 2012

У меня была такая же проблема ... Вы можете использовать пользовательский 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;
}
}
4 голосов
/ 24 ноября 2017

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

@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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...