16

我怎样才能让 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" />

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

4

2 回答 2

15

我遇到了这个问题,并没有在互联网上找到解决方案。我通过创建重新测量给定文本的新组件 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 后可用。

于 2012-12-22T08:20:21.557 回答
1

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

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

希望这可以帮助。

于 2013-06-25T12:49:47.170 回答