2011-01-05 2 views
33

Iam, планируя создать 3 кнопки с layout_weight = 1, не заинтересован в пользовательском диалоге. Так что я написал ниже код. Это не работает. Всегда да, кнопка дает мне null , Что не так в этом коде?Метод alertDialog.getButton() дает исключение из null-указателя android

AlertDialog dialog= new AlertDialog.Builder(this).create(); 
      dialog.setIcon(R.drawable.alert_icon); 
      dialog.setTitle("title"); 
      dialog.setMessage("Message"); 
      dialog.setButton(AlertDialog.BUTTON_POSITIVE,"Yes", new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface arg0, int arg1) { 
               } 
      }); 
      Button yesButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE); 
      Log.w("Button",""+yesButton);//here getting null 
      LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1f); 
      yesButton.setLayoutParams(layoutParams); 
      dialog.show(); 

С уважением, Разработчик Android.

ответ

52

Посмотрите здесь для ответа: http://code.google.com/p/android/issues/detail?id=6360

Как говорится в комментарии # 4 Вы должны вызвать show() на вашем диалоге, прежде чем вы можете получить доступ к кнопкам, они не доступны заранее. Для автоматического решения о том, как изменить кнопки, как только они будут готовы увидеть Mickeys answer

+1

Still проблемы persist.No использования этой ссылки. – ADIT

+11

Прочтите комментарий # 4, используйте dialog.show(); перед использованием getButton() – vieux

+1

Спасибо wieux.It работает – ADIT

4

Спасибо wieux.But для новых разработчиков понимания цели Iam код переписывания ниже

AlertDialog dialog= new AlertDialog.Builder(this).create();    
dialog.setIcon(R.drawable.alert_icon);    
dialog.setTitle("title");    
dialog.setMessage("Message");    
dialog.setButton(AlertDialog.BUTTON_POSITIVE,"Yes", new DialogInterface.OnClickListener() {     @Override     
public void onClick(DialogInterface arg0, int arg1) {             
}    
}); 
    dialog.show(); 
       Button yesButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);    Log.w("Button",""+yesButton);//here getting null    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1f);    yesButton.setLayoutParams(layoutParams);   
+1

он не работает для меня. –

43

Это работает для меня:

только
AlertDialog alertDialog = new AlertDialog.Builder(this) 
       .setMessage(message) 
       .setCancelable(true) 
       .setPositiveButton("Yes", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
          //do smthng 
         }) 
       .setNegativeButton("No", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         //do snthn 
        } 
       }).create(); 

     alertDialog.setOnShowListener(new OnShowListener() { 
      @Override 
      public void onShow(DialogInterface dialog) {     // 
       Button positiveButton = ((AlertDialog) dialog) 
         .getButton(AlertDialog.BUTTON_POSITIVE); 
       positiveButton.setBackgroundDrawable(getResources() 
         .getDrawable(R.drawable.btn_default_holo_dark)); 

       Button negativeButton = ((AlertDialog) dialog) 
         .getButton(AlertDialog.BUTTON_NEGATIVE); 
       positiveButton.setBackgroundDrawable(getResources() 
         .getDrawable(R.drawable.btn_default_holo_dark)); 
      } 
     }); 

     alertDialog.show(); 

в таком порядке, вызовите alertDialog.setOnShowListener после create()

+0

setOnShowListener - это API 8+ –

+1

setOnShowListener решил мою проблему –

+0

Это должно быть отмечено как правильный ответ. +1 –