2011-02-06 43 views
6

TextViewに入れるテキストがあります。私はsetText()を使ってそれをしました。TextViewの高さを取得

ここで、TextViewでテキストが占める行数または高さを調べる必要があります。 getHeight()を使ってみましたが、常に0を返します。

TextViewにあるテキストの高さを取得するにはどうしますか?

+1

レンダリングされるまでビューの高さを取得することはできません。そのため、テキストを設定した直後に高さをチェックしていると常に0が返されます。なぜあなたは高さを知る必要がありますか?あなたが達成しようとしていることの詳細を説明してください。 –

+0

実際には、テキストだけでなく画像(電子ブックリーダーのようなもの)をページ単位で表示するアプリケーションを開発しなければなりません(スクロールバーを含めるべきではありません)私は画面上にテキストがどれくらい占有されているかを知る必要があります。 –

答えて

6

ジョンが指摘したように、あなたはすぐのsetText後の高さを取得することができなくなりますもう一つの方法はこれです。 TextView自体でgetHeight()を使用することで多くのことが助けになるかどうかはわかりません。ビューの高さは、ビュー内の可視テキストの高さに依存するだけでなく、TextViewが存在するビューグループ/レイアウトにも依存します。ビューグループがTextViewに高さを最大にすると、getHeight()テキストがレンダリングされるまで待っている場合。

私はこれを行うことができるいくつかの方法を参照してください。

  1. サブクラスのTextViewをしてonSizeChanged方法を上書きします。そこで、supers onSizeChangedを呼び出して、getLineCount()でTextView内の行数を取得し、getLineHeight()で行あたりの高さを取得します。これは、レイアウトやその他に応じて、getHeight()を使うよりも良いかもしれません。
  2. Textviewsディメンションは使用しないでください。 TextView.PaintをTextView.getPaint()で取得し、幅と高さを計算します。

    Rect bounds; paint.getTextBounds(text、0、text.length()、bounds);

これで、範囲が制限されます。 paint.breakTextを使って、1行に収まるテキストの量を確認することができます。おそらくあまりにも面倒で、Textureで使用されているのと同じロジックであることが保証されていません。

+0

Kread ..メインクラスにあるTextViewオブジェクトをサブクラスで使用できるように、TextViewのサブクラス化の例をいくつか教えてください。 –

+0

パブリッククラスMyTextはTextViewをオーバーライドしています。{オーバーライド方法はこちら}メインクラスでは、 MyText textView =新しいMyText(これ); " "TextView textView = new TextView(this);"の代わりに使用します。代わりにXMLレイアウトを使用したい場合は、http://developer.android.com/guide/topics/ui/custom-components.htmlを読むことをお勧めします(実際にJavaでのものを作成するにはあまりにもそれを読んでください)。 –

+0

Thnks ..しかし、onSizeChangedメソッドが最後に呼び出されています! getLineCountはアプリケーションの途中で使用できません!つまり、textview.getLineCount()で変数を初期化する場合は、テキストを設定しても変数の値は0になります。 –

13

このサイズはレイアウトが完了した後でしかわからないため、カスタムテキストビューを作成してonSizeChangedメソッドを使用します。

final TextView tv = (TextView) findViewById(R.id.myTextView); 
    ViewTreeObserver vto = tv.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      Toast.makeText(MyActivity.this, tv.getWidth() + " x " + tv.getHeight(), Toast.LENGTH_LONG).show(); 
      tv.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     } 
    }); 

私はここに見つけたこのコード:How to retrieve the dimensions of a view?

+0

私はこの..thnq ..から有用なものを得ることができると思います。 –

+0

上記のコードでは、テキストビューはコードの最後でのみ達成することができます。私は真ん中でそれを得ることができません!私は高さを格納するために変数を取って、onGlobalLayout()でtv.getHeight()で変数を初期化しました..しかし、varibleの値は、最後まで0です..最後にテキストの高さに変更... –

+0

It working ..thanks @Lumis – John