Почему обертывание содержимого в несколько строк 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"
/>
Ответы
Ответ 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);
}