如何使textView完全包装其多行内容?

Ant*_*ich 11 android textview android-layout

如何使textview完全包装这样的文本?

android:width属性不是解决方案,因为文本是动态的.

期望的行为

|Adcs  |
|adscfd|
Run Code Online (Sandbox Code Playgroud)

目前的行为:

|Adcs      |
|adscfd    |
Run Code Online (Sandbox Code Playgroud)

这里是代码(TextViews的样式只定义textColor,textSize,textStyle等).

<TextView
        android:id="@+id/text_title_holder"
        style="@style/TextBold.Black.Title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:maxWidth="100dp"
        android:maxLines="2"
        android:text="Adcs adscfd"
        android:gravity="left"
        android:visibility="visible" />
Run Code Online (Sandbox Code Playgroud)

mutiline TextView上的主题wrap_content宽度没有很好的答案.

sky*_*sky 12

我遇到了这个问题,并没有在互联网上找到解决方案.我通过创建新组件TightTextView来完成这个技巧,该组件重新测量给定文本,以防您指定组件的maxWidth并且Layout(文本)的宽度小于视图的测量宽度.

package com.client.android.app.views;

import android.content.Context;
import android.text.Layout;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * Tightly wraps the text when setting the maxWidth.
 * @author sky
 */
public class TightTextView extends TextView {
    private boolean hasMaxWidth;

    public TightTextView(Context context) {
        this(context, null, 0);
    }

    public TightTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TightTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

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

        if (hasMaxWidth) {
            int specModeW = MeasureSpec.getMode(widthMeasureSpec);
            if (specModeW != MeasureSpec.EXACTLY) {
                Layout layout = getLayout();
                int linesCount = layout.getLineCount();
                if (linesCount > 1) {
                    float textRealMaxWidth = 0;
                    for (int n = 0; n < linesCount; ++n) {
                        textRealMaxWidth = Math.max(textRealMaxWidth, layout.getLineWidth(n));
                    }
                    int w = Math.round(textRealMaxWidth);
                    if (w < getMeasuredWidth()) {
                        super.onMeasure(MeasureSpec.makeMeasureSpec(w, MeasureSpec.AT_MOST),
                                heightMeasureSpec);
                    }
                }
            }
        }
    }


    @Override
    public void setMaxWidth(int maxpixels) {
        super.setMaxWidth(maxpixels);
        hasMaxWidth = true;
    }

    @Override
    public void setMaxEms(int maxems) {
        super.setMaxEms(maxems);
        hasMaxWidth = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

!刚刚将它移植到较旧的android API,因为getMaxWidth()仅在API级别16之后可用.