正如@EarlGrey 所说,请参阅为什么将内容包装在多行 TextView 填充父项中?.
public class WrapWidthTextView extends AppCompatTextView {
public WrapWidthTextView(Context context) {
super(context);
}
public WrapWidthTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public WrapWidthTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@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);
}
private float getMaxLineWidth(Layout layout) {
float max_width = 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;
}
}
在 XML 中:
<com.your_package.WrapWidthTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
...
/>
不要忘记重建项目以查看 XML 的变化。