2012-12-23 20 views
1

我有一個Android.os.Handler Activity,用於與openGL線程進行通信。 我想從OpenGL的線程中獲取消息,並根據消息數據的活動得出一些GUI,所以我做的:在handleMessage中動態更改onClickListener,具體取決於消息

Handler handle = new Handler(new Handler.Callback(){ 
     public boolean handleMessage(Message msg){ 
      // update GUI like 
      TextView v1 = (TextView) GamescreenActivity .this.findViewById(R.id.mytextview) 
      // then what I actually would like to do but it does not work: 
      Button b = (Button) GamescreenActivity.this.findViewById(R.id.mybutton); 
      b.setOnClickListener(null); 
      if (msg.what == MY_OWN_CONSTANT) { 
       b.setOnClickListener(getOnClickDoSomething(msg)); 
      } 
     } 
View.OnClickListener getOnClickDoSomething(final Message msg) { 
    return new View.OnClickListener() { 
     public void onClick(View v) { 
      makeDialog(msg); 
     } 
    }; 
} 
private void makeDialog(Message msg) {  
    AlertDialog.Builder builder = new AlertDialog.Builder(GamescreenActivity.this); 
    builder.setMessage("yo") 
    .setTitle(""+ msg.what); 
    AlertDialog dialog = builder.create(); 
    dialog.show(); 
} 

我希望這是清楚我想要實現的。我現在得到的東西幾乎是所有的時間都是msg在makeDialog方法中爲null。

回答

1

我現在得到的東西幾乎是所有的時間都是msg在makeDialog方法中爲null。

我相信發生這種情況時消息已經被回收。讓我們創建一個msg的本地副本,並稍微修改您的代碼以使其更有效。首先創建一個新的字段變量:

Message message; 

下一個改變你的if-else塊:

if (msg.what == MY_OWN_CONSTANT) { 
    message = Message.obtain(msg); 
    b.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(GamescreenActivity.this); 
      builder.setMessage("yo") 
        .setTitle(""+ message.what) 
        .show(); 
      message.recycle(); // Recycle our message when we're done 
     } 
    }); 
} 
else { 
    b.setOnClickListener(null); 
} 
相關問題