2012-12-23 3 views
1

OpenGL 스레드와의 통신에 사용되는 Android.os.Handler를 사용한 활동이 있습니다. 나는 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(); 
} 

나는 내가 달성하기 위해 노력하고있어 분명하다 바랍니다. 지금 내가 뭘 얻는지는 거의 항상 makeDialog 메서드에서 msg가 null이된다.

답변

1

지금까지 얻을 수있는 것은 거의 항상 makeDialog 메서드에서 msg가 null입니다.

나는이 메시지가 이미 발생했을 때 이미 재활용 된 것으로 생각합니다. msg의 로컬 복사본을 만들고 코드를 좀 더 효율적으로 만들도록 수정 해 봅시다.

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); 
} 
:

Message message; 

다음 귀하의 경우 - 다른 블록을 변경 : 먼저 새 필드 변수를 생성

관련 문제