0

拡張しているクラスがありLinearLayoutます。

以下のコードスニペット:

class MyLinearLayout extends LinearLayout{

static TextView  txt;
static Button btn;
static LayoutInflater inflater;

public MyLinearLayout(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    View.inflate(context, R.layout.displayinfo, this);
    inflater = (LayoutInflater)  getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    // TODO Auto-generated method stub
    super.onLayout(changed, l, t, r, b);
}

public  void change(){

     View view =inflater.inflate(R.layout.displayinfo, null);
     //Button btn = (Button) inflate(context, R.id.btn, null);
     txt = (TextView) view.findViewById(R.id.textView1);
     Handler handler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
             txt.setText("Changed");

         }
     };
     //view.refreshDrawableState();


}

@Override
protected void onDraw(Canvas canvas) {
    change();
}
}

しかし、onDraw()->change()メソッドが呼び出されても値は変更されません。このビューを に追加していますWindowManager

この拡張ビューでは、基本的に から値を更新する必要がありarrayます。しかし、問題はループを連続して呼び出す方法ですか? を呼び出すinvalidate()と、継続的に呼び出すことができますが、CPU 使用率が増加するだけでなく、ビューが非常に速く更新されるため、ユーザーは実際に を表示できませんView

したがって、基本的に2つの問題があります。

1.TextView上記のコード スニペットで更新されていませんか?

2.メソッドを呼び出さずにビュー値を基本的に継続的に更新するにはどうすればよいinvalidate()ですか?

前もって感謝します

4

1 に答える 1

0

change() の内部にはハンドラーがあり、テキストを変更するように指示して handleMessage() をオーバーライドしているため、change を呼び出してもテキストは変更されません。実際に変更を行うには、ハンドラーにシグナルを送信する必要があります。

この行を入れてみてください:

handler.sendEmptyMessage(0);

代わりに

//view.refreshDrawableState();

次に、変更メソッドは実際にテキストを TextView に設定する必要があります。

編集:また、変更を呼び出すたびに新しいビューを膨らませるべきではありません。実際、コンストラクターで既にインフレートしているため、インフレートする必要はまったくありません (既に参照を取得しようとしているビューです)。TextView 参照を取得するには、その前に参照なしで findViewById() を呼び出すことができるはずです。change() 内ではなく、コンストラクターでそれを行う必要があります。

于 2012-05-09T13:30:21.427 に答える