2012-03-17 4 views
8

複数の行に展開されるTextViewは、可能な限り最大幅に収まるように自動的に展開されるようです。それをどうやって防ぐことができますか?複数行のTextViewが最大幅まで不必要に拡大するのを防ぐ

は、ここでレイアウト例(のtest.xml)である

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@color/white"> 
<TextView 
android:background="@color/green" 
android:layout_alignParentRight="true" 
android:id="@+id/foo" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:gravity="right" 
android:text="This is the message a much shorter message" 
android:textAppearance="?android:attr/textAppearanceMedium" 
android:textColor="@color/black" /> 
</RelativeLayout> 

TextView shown with maximum width

私は左側に余白を追加した場合、それが正しく(コンテンツを再フォーマットせず)のTextViewの幅を縮小し、 TextViewの内容を考慮して余白のサイズを計算する必要があります。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@color/white"> 
<TextView 
android:layout_marginLeft="32dp" 
android:background="@color/green" 
android:layout_alignParentRight="true" 
android:id="@+id/foo" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:gravity="right" 
android:text="This is the message a much shorter message" 
android:textAppearance="?android:attr/textAppearanceMedium" 
android:textColor="@color/black" /> 
</RelativeLayout> 

TextView show with margin

答えて

0

それはあなたが左使用からパディングを持つようにしたい場合は、パディングを持っているあなたを助けますandroid:padding="32dp" 使用android:paddingLeft="32dp"

+1

問題はパディングではありません。 TextViewで実際にコンテンツをラップして、複数行になると親ビューの幅に拡大します。 –

7
あなたは計算オーバーライドされたメソッドonMeasure()でカスタムのTextViewを使用することができ

幅:

public class WrapWidthTextView extends TextView { 

... 

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

    Layout layout = getLayout(); 
    if (layout != null) { 
     int width = (int)FloatMath.ceil(getMaxLineWidth(layout)) 
       + getCompoundPaddingLeft() + getCompoundPaddingRight(); 
     int height = getMeasuredHeight();    
     setMeasuredDimension(width, height); 
    } 
} 

private float getMaxLineWidth(Layout layout) { 
    float max_width = 0.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; 
} 

}

+0

+1000 :)ありがとう! –

0

私はVitaliy Polchukのソリューションを試してみましたが正常に動作します。そして、私はまた、小さな修正を追加したい:

... 
@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    Layout layout = getLayout(); 
    if (layout != null) { 
     int width = (int) FloatMath.ceil(getMaxLineWidth(layout)) 
       + getCompoundPaddingLeft() + getCompoundPaddingRight(); 
     widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY); 
    } 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    // get already measured dimensions 
    int width = getMeasuredWidth(); 
    int height = getMeasuredHeight(); 
    setMeasuredDimension(width, height); 
} 
... 
0

あなたは@Vitaliy Polchuk(トップの答え)の提案を使用する場合は、その書き換えやWhy is wrap content in multiple line TextView filling parent?で彼の答えを参照してください。

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 widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

     Layout layout = getLayout(); 
     if (layout != null) { 
      int width = (int) Math.ceil(getMaxLineWidth(layout)) 
        + getCompoundPaddingLeft() + getCompoundPaddingRight(); 
      int height = getMeasuredHeight(); 
      setMeasuredDimension(width, height); 
     } 
    } 

    private float getMaxLineWidth(Layout layout) { 
     float max_width = 0.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に挿入すると、プロジェクトを再構築します。それ以外の場合、このクラスは見つかりません。

関連する問題