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. 但问题是如何连续调用循环?调用 aninvalidate()可以帮助我连续调用它,但它会增加 CPU 使用率,并且视图刷新得如此之快,以至于用户实际上无法查看View.

所以基本上我有两个问题:

1.TextView上面的代码片段没有更新?

2.我们如何在不调用invalidate()方法的情况下基本持续更新视图值?

提前致谢

4

1 回答 1

0

调用 change 不会更改文本,因为在 change() 内部您有一个处理程序,并且您通过告诉它更改文本来覆盖它的 handleMessage()。为了实际进行更改,您需要向处理程序发送信号。

试着把这条线:

handler.sendEmptyMessage(0);

代替

//view.refreshDrawableState();

那么 change 方法实际上应该在 TextView 中设置文本。

编辑:另外,您可能不应该在每次调用更改时都夸大新视图。事实上,您根本不需要膨胀,因为您已经在构造函数中完成了它(您已经是您试图获取参考的视图)。您应该能够在前面没有任何引用的情况下调用 findViewById() 来获取 TextView 引用。您应该在构造函数中而不是在 change() 中执行此操作。

于 2012-05-09T13:30:21.427 回答