为什么在多行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" /> 

我也有同样的问题…您可以使用自定义的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; } } 

上面接受的答案的一点点优化解决scheme:

 @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); }