16

テキストビューでそのようなテキストを正確にラップするにはどうすればよいですか?

テキストは動的であるため、android:width 属性は解決策ではありません。

望ましい動作

|Adcs  |
|adscfd|

現在の動作:

|Adcs      |
|adscfd    |

コードは次のとおりです (TextView のスタイルは、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" />

マルチライン TextViewのトピックwrap_content 幅には、適切な答えがありません。

4

2 に答える 2

15

私はこの問題に直面しましたが、インターネットで解決策が見つかりませんでした。コンポーネントの maxWidth を指定し、(テキストの) レイアウトの幅がビューの測定幅よりも小さい場合に備えて、指定されたテキストを再測定する新しいコンポーネント TightTextView を作成することで、このトリックを実行しました。

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

!!! getMaxWidth() は API レベル 16 以降でのみ使用できます。

于 2012-12-22T08:20:21.557 に答える
1

この質問は少し古いですが、mapView の上の黒いボックスに緑色のテキストが必要で、textView を RelativeLayout コンテナーに入れることで回避するというこの問題もありました。次に、パディングを使用して境界線のサイズを設定しました。textView がテキストをうまく包み込みます。日食での私のアウトラインは次のようになります。

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

お役に立てれば。

于 2013-06-25T12:49:47.170 に答える