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

时间:2012-06-06 11:32:51

标签: android android-layout textview

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

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

期望的行为

|Adcs  |
|adscfd|

目前的行为:

|Adcs      |
|adscfd    |

这里是代码(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" />

主题wrap_content width on mutiline TextView没有好的答案。

2 个答案:

答案 0 :(得分: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;
    }
}

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

答案 1 :(得分:1)

这个问题现在有点老了,但是我也遇到了这个问题,我希望在mapView上的黑框中使用绿色文本,并将我的textView放在RelativeLayout容器中。然后我使用填充来设置边框大小。 textView现在可以很好地拥抱文本。 我在Eclipse中的大纲看起来像这样。

RelativeLayout
    mapview
    LinearLayout
        RelativeLayout
            textView1  << this is the box I want to hug the text
        imageView1
    RelativeLayout
    etc....

希望这有帮助。