2013-01-17 11 views
16

TextViewの高さを決定する前に、が描画されています。私はそれを行うには、次のコードを使用しています:ラップされたテキストを含むTextViewのgetMeasuredHeight()

TextView textView = (TextView) findViewById(R.id.textview); 
textView.setText("TEST"); 
int widthSpec = MeasureSpec.makeMeasureSpec(LayoutParams.MATCH_PARENT, MeasureSpec.EXACTLY); 
int heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 
textView.measure(widthSpec, heightSpec); 
System.out.println("MeasuredHeight: " + textView.getMeasuredHeight()); 

出力がMeasuredHeight: 28です。それには何も問題ありません。私はTextView長いテキスト文字列を与えるので、ラッピングが発生したときに

しかし、それはまだ一行の高さの代わりに、2を与える:

(...) 
textView.setText("TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST"); 
(...) 

出力は、私がMeasuredHeight: 56を期待MeasuredHeight: 28、あります。

なぜ私に適切な価値が与えられず、正しい価値を達成するにはどうすればよいですか?

+0

で高さを設定するgetActual高さ関数を使用する必要があります! [1]:http://stackoverflow.com/questions/6157652/android-getmeasuredheight-returns-wrong-values – ObAt

+0

私はそのスレッドとこの1つで提案されたソリューションを試しました(http:// stackoverflow .com/questions/4668939/viewgrouptextview-getmeasuredheight-wrong-value-is-real-than)は、同じ結果を示します。 – nhaarman

+0

あなたはそのコードを正確にどこで使いましたか? – Luksprog

答えて

9

これはonCreateメソッドです。ビュー階層全体がまだ測定およびレイアウトされていません。だから、textViewの親はその幅を知らない。そのため、textViewの次元は親の次元によって制約されません。そう、それはあなたのTextView幅が200個のピクセルに等しい作る

int widthSpec = MeasureSpec.makeMeasureSpec(200, MeasureSpec.EXACTLY); 

はあなたに行を変更してください。

テキストビューの高さがなぜ必要なのか説明すると、おそらく私たちはあなたを助けることができます。

+0

さて、高さは28以上ですが、明らかに 'TextView'は200ピクセル幅ではありません。 – nhaarman

+1

拡張アニメーションを作成するために 'TextView'の高さを知る必要があります。特に、複数のコンポーネントを含む 'ViewGroup'を拡張しています。アニメーションについては、アニメーションする高さを知る必要があります。最初は 'ViewGroup'が' Gone'で、高さを '0'に設定し、可視性を' VISIBLE'に設定し、高さを測定した高さまで徐々に増やします。 – nhaarman

+0

@Niek: 'TextView'の利用可能な幅を知っていますか?それはおそらくウィンドウの幅にマッチしていますか? –

4

ええ、私は最近、この1つに自分自身を打ちました。最も良い方法は、ViewTreeObserverオブジェクトを作成し、ViewTreeObserver.OnGlobalLayoutListenerを登録することです。これは、レイアウト段階の後で描画段階の前に呼び出されます。その時点でTextViewのサイズを取得することができます。

厳密に言えば、テキスト自体ではなく、TextView全体です。内部パディングが関係する場合、実際のテキストはTextViewより小さくなります。

実際のテキストのサイズが本当に必要な場合は、textView.getLayout()を使用して、テキストのLayoutオブジェクトを取得し、次にlayout.getHeight()を使用します。

+0

さまざまな理由で 'OnGlobalLayoutListener'を使用することはできません。1つは、レイアウトの残りの部分が描画された後、ある時点で可視性「GONE」を持つ 'TextView'の高さを測定する必要があります。 – nhaarman

0

カスタムのTextViewを作成し、あなたのレイアウトでそれを使用し、たぶん[これは] [1]あなたを助ける、それはほとんど同じ問題のランタイム

public class TextViewHeightPlus extends TextView { 
    private static final String TAG = "TextViewHeightPlus"; 
    private int actualHeight=0; 


    public int getActualHeight() { 
     return actualHeight; 
    } 

    public TextViewHeightPlus(Context context) { 
     super(context); 
    } 

    public TextViewHeightPlus(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setCustomFont(context, attrs); 
    } 

    public TextViewHeightPlus(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     actualHeight=0; 

     actualHeight=(int) ((getLineCount()-1)*getTextSize()); 

    } 

} 
+0

なぜそこに「-1」がありますか? –

関連する問題