2017-08-20 12 views
-1

myCustomViewクラスのonDrawメソッドにtextviewを追加しようとしています。これを行うと問題なく動作します。onDrawにTextViewを追加する際のNullPointer例外

tv = new TextView(context); 
tv.setTextSize(14); 
tv.layout(left, top, right, bottom); 
tv.setGravity(Gravity.CENTER); 
tv.setText(text); 
canvas.save(); 
canvas.translate(left, top); 
tv.draw(canvas); 

しかし、私はonDrawでTextViewをインスタンス化したくありません。たとえば、(onDrawの)TextViewをクラスコンストラクタの外で初期化すると、このコードは機能します。それは、私に次のエラーを与える

のjava.lang.NullPointerException:android.widget.TextView.checkForRelayoutでnullオブジェクト参照 に 'int型 android.view.ViewGroup $ LayoutParams.width' フィールドから読み取ろうとしandroid.widget.TextView.setText(のTextViewでandroid.widget.TextView.setText(TextView.java:5234) でandroid.widget.TextView.setTextで(TextView.java:8447)​​ (TextView.java:5378) .java:5191)

このエラーの理由は?

答えて

2

なぜあなたはonDrawにTextViewを追加しますか?これを行うには正当な理由はありません、それは厄介なパフォーマンスを必要としません。 onDrawでテキストを描画する場合は、canvas.drawText()を使用します。 textViewを追加する場合は、通常の場所で行います。できるだけ速くする必要がある、アプリケーションの一部であるレンダリングでそれをしないでください。可能であれば、onDrawはオブジェクトを作成しないようにする必要があります。

また、そのビューを追加しようとすると、正しく表示されませんでした。それを親ビューに追加してから、その親レイアウトにしなければなりません。新しい直後にはView階層の一部ではないため、画面に描画されません。特定のクラッシュはビュー階層に追加されていないため、レイアウトパラメータがないためです。しかし、修正しないでください。ここにViewを追加したり、drawTextを使用したり、Viewを他の場所に追加したりしないでください。

+0

ご意見ありがとうございます。私は古いコードを理解しようとしています。 – asish

関連する問題