49 votes

La méthode alertDialog.getButton() donne lieu à une exception concernant les pointeurs nuls sous Android.

J'ai l'intention de créer 3 boutons avec layout_weight=1, je ne suis pas intéressé par le dialogue personnalisé. J'ai donc écrit le code ci-dessous, mais il ne fonctionne pas. Qu'est-ce qui ne va pas dans ce code ?

  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();

Regards, Développeur Android.

87voto

vieux Points 2367

Jetez un coup d'œil ici pour la réponse : http://code.google.com/p/Android/issues/detail?id=6360

Comme il est dit dans le commentaire n° 4, vous devez appeler show() sur votre boîte de dialogue avant de pouvoir accéder aux boutons, ils ne sont pas disponibles au préalable. Pour une solution automatique sur la façon de modifier les boutons dès qu'ils sont prêts voir Réponse de Mickeys

67voto

Mickey Tin Points 438

Cela fonctionne pour moi :

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(); 

uniquement dans cet ordre, appelez alertDialog.setOnShowListener après create()

6voto

ADIT Points 2218

Merci wieux. Mais pour permettre aux nouveaux développeurs de comprendre, je réécris le code ci-dessous

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

0voto

DamienL Points 365

Voici des fonctions d'extensions Kotlin utiles pour réaliser ce que vous voulez avec une solution automatique :

import android.content.DialogInterface.BUTTON_NEGATIVE
import android.content.DialogInterface.BUTTON_POSITIVE
import androidx.appcompat.app.AlertDialog

fun AlertDialog.onPositiveButtonClick(action: () -> Unit) {
    onButtonClick(BUTTON_POSITIVE, action)
}

fun AlertDialog.onNegativeButtonClick(action: () -> Unit) {
    onButtonClick(BUTTON_NEGATIVE, action)
}

fun AlertDialog.onButtonClick(whichButton: Int, action: () -> Unit) {
    fun onButtonClick() = getButton(whichButton).setOnClickListener { action() }

    if (isShowing) {
        onButtonClick()
    } else {
        setOnShowListener {
            onButtonClick()
        }
    }
}

Mode d'emploi :

alertDialog.onPositiveButtonClick { /* DO WHAT YOU WANT HERE */ }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X