2011-09-16 11 views
20

私はレンダリング時に親のすべての利用可能な幅をとるandroid:layout_width="wrap_content"に設定された複数行のテキストビューを持っています。テキストが1行に収まる場合、wrap_contentはうまく動作しますが、複数の行でテキストビューが両脇のパディングのように見えるままにして、親の幅と一致するようです。テキストを複数行にまとめてラップするのはなぜですか?

テキストは1行に収まらないため、テキストビューは利用可能なすべての幅を必要としていますか?私はビューが可能な限り小さい次元に拘束されるようにしたい。

アイデア?参考のため

が、ここではレイアウトの定義は次のとおりです。

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:singleLine="false" 
    android:textSize="24sp" 
    android:textStyle="bold" 
    android:textColor="@color/white" 
    android:gravity="center_horizontal" 
/> 
+0

可能な最小の幅は、ほとんどの場合、1行につき1語になります...達成しようとしているのでしょうか? – BrainCrash

+0

テキストの解析とラッピングは問題ありませんが、背景色を追加すると、ビューの幅が親の幅に広がり、テキストの両側にソートが残ることがわかります。一行のテキストはこれをしませんが、一度テキストが折り返されると、利用可能な幅がすべて必要であると思われます。解析した後、何らかの形でビューの再レイアウトとコンテンツのラップを行うことができればうれしいでしょう。 – Chase

+0

@Chase:私は同じ問題を抱えていて、ここの答えはそれを解決しませんでした。あなたはそれを解決することができましたか?ここに私の質問を参照してください:http://stackoverflow.com/questions/22970783/correct-textview-padding – oat

答えて

38

私はあなたが幅を計算オーバーライドされたメソッド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) 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; 
} 
} 
+0

これは答えとしてマークする必要があります。 – sidon

+0

これは完全に正しい答えです。ありがとうございました! – Tomasz

+0

@Vitaliy Polchuk:http://stackoverflow.com/questions/22970783/correct-textview-padding – oat

0

上記受け入れ答えのために少し最適化されたソリューション:

@Override 
protected void onMeasure(int widthSpec, int heightSpec) { 
    int widthMode = MeasureSpec.getMode(widthSpec); 

    // if wrap_content 
    if (widthMode == MeasureSpec.AT_MOST) { 
     Layout layout = getLayout(); 
     if (layout != null) { 
      int maxWidth = (int) Math.ceil(getMaxLineWidth(layout)) + 
          getCompoundPaddingLeft() + getCompoundPaddingRight(); 
      widthSpec = MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST); 
     } 
    } 
    super.onMeasure(widthSpec, heightSpec); 
} 
関連する問題