web-dev-qa-db-fra.com

Changer la couleur des boutons dans AlertDialog

Comment puis-je changer la couleur des boutons dans un AlertDialog dans Android?

39
mtr

Voici comment j'ai fait.

AlertDialog.Builder customBuilder = new AlertDialog.Builder(new ContextThemeWrapper(this,Android.R.style.Theme_Dialog));

customBuilder.setTitle(R.string.popup_error_title);
customBuilder.setNegativeButton("Exit application", new DialogInterface.OnClickListener() {  
    public void onClick(DialogInterface dialog, int which) {  
        MyActivity.this.finish();
    }  
});

AlertDialog dialog = customBuilder.create();
dialog.show();

Button b = dialog.getButton(DialogInterface.BUTTON_NEGATIVE);

if(b != null) {
    b.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_button));
}

Je trouve le drawable ici

66
jbpin

Étant donné que la plupart des gens utilisent probablement un DialogFragment , j'ai rencontré quelques problèmes et j'ai cliqué sur mon chemin à travers plusieurs SO réponses pour les résoudre. Permettez-moi de poster ma solution actuelle.

J'ai fini par définir l'arrière-plan du bouton avec des dessinables personnalisés comme déjà suggéré plusieurs fois. Cependant, cela n'était pas encore possible dans la méthode onCreateDialog- de la DialogFragment. Vous pouvez soit le faire, par exemple dans onStart(), ou (qui est ce que j'ai préféré) dans l'écouteur onShow- de la boîte de dialogue! N'oubliez pas cependant que vous devez invalider vos boutons après les modifications.

Quant aux marges: supprimez simplement le remplissage de votre Drawable-XML pour les boutons.

# onCreateDialog dans votre DialogFragment:

@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
  AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

  // setup your dialog here...

  builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
    @Override
    public void onClick(final DialogInterface dialog, final int which) {
      // do something
    }
  });

  builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
    @Override
    public void onClick(final DialogInterface dialog, final int which) {
      // do something
    }
  });

  final AlertDialog dialog = builder.create();

  dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(final DialogInterface dialog) {
      Button negativeButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_NEGATIVE);
      Button positiveButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_POSITIVE);

      // this not working because multiplying white background (e.g. Holo Light) has no effect
      //negativeButton.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);

      final Drawable negativeButtonDrawable = getResources().getDrawable(R.drawable.alert_dialog_button_light_red);
      final Drawable positiveButtonDrawable = getResources().getDrawable(R.drawable.alert_dialog_button_light_green);
      if (Build.VERSION.SDK_INT >= 16) {
        negativeButton.setBackground(negativeButtonDrawable);
        positiveButton.setBackground(positiveButtonDrawable);
      } else {
        negativeButton.setBackgroundDrawable(negativeButtonDrawable);
        positiveButton.setBackgroundDrawable(positiveButtonDrawable);
      }

      negativeButton.invalidate();
      positiveButton.invalidate();
    }
  });

  return dialog;
}

Exemple XML dessinable pour un bouton:

<?xml version="1.0" encoding="utf-8"?>
<selector
  xmlns:Android="http://schemas.Android.com/apk/res/Android">

  <item Android:state_pressed="true" >
    <shape>
      <gradient
        Android:startColor="@color/alert_dialog_button_green_pressed1"
        Android:endColor="@color/alert_dialog_button_green_pressed2"
        Android:angle="270" />
    </shape>
  </item>

  <item Android:state_focused="true" >
    <shape>
      <gradient
        Android:endColor="@color/alert_dialog_button_green_focused1"
        Android:startColor="@color/alert_dialog_button_green_focused2"
        Android:angle="270" />
    </shape>
  </item>

  <item>
    <shape>
      <gradient
        Android:endColor="@color/alert_dialog_button_green1"
        Android:startColor="@color/alert_dialog_button_green2"
        Android:angle="270" />
    </shape>
  </item>
</selector>

N'oubliez pas de définir vos couleurs dans le res\values\colors.xml, par exemple. comme ça (je ne voulais pas de dégradé, donc les couleurs 1 et 2 sont les mêmes):

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <color name="alert_dialog_button_green1">#b4099930</color>
  <color name="alert_dialog_button_green2">#b4099930</color>
  <color name="alert_dialog_button_green_focused1">#96099930</color>
  <color name="alert_dialog_button_green_focused2">#96099930</color>
  <color name="alert_dialog_button_green_pressed1">#96099930</color>
  <color name="alert_dialog_button_green_pressed2">#96099930</color>
</resources>
18
Blacklight

Je l'ai fait par ce code, il pourrait vous aider:

AlertDialog.Builder builder1 = new AlertDialog.Builder(this); 
        builder1.setCancelable(true);
     builder1.setTitle("abc");
      builder1.setMessage("abcdefg");
      builder1.setInverseBackgroundForced(true);
     builder1.setPositiveButton("Yes",
             new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int id) {
             dialog.cancel();
         }
     }); 

     builder1.setNegativeButton("No",
             new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int id) {
             dialog.cancel();
         }
     });

     AlertDialog alert11 = builder1.create();
     alert11.show(); 

     Button buttonbackground = alert11.getButton(DialogInterface.BUTTON_NEGATIVE); 
     buttonbackground.setBackgroundColor(Color.BLUE); 

     Button buttonbackground1 = alert11.getButton(DialogInterface.BUTTON_POSITIVE); 
     buttonbackground1.setBackgroundColor(Color.BLUE);
13
Amitsharma

Je voulais résoudre ce problème avec des thèmes plutôt qu'avec du code supplémentaire, car il me semble plus propre d'avoir tous les éléments liés au style dans styles.xml. Ce que j'ai fait était basé sur la réponse d'Arade et cette autre question :

<style name="AlertDialogDanger" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorAccent">@color/error</item>
</style>

Cela changera la couleur du texte du bouton de toute boîte de dialogue d'alerte que vous créez avec le style AlertDialogDanger. Faire cela:

    new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AlertDialogDanger))
            .setMessage("Really delete?")
            .setPositiveButton("Delete", null)
            .setNegativeButton("Cancel", null)
            .create().show();
10
Fabian Streitel

Voici un exemple:

AlertDialog.Builder b = new AlertDialog.Builder(all.this);

b.setMessage("r u wan't 2 exit");
b.setCancelable(false);

b.setNegativeButton("no", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        dialog.cancel();    
    }
});

b.setPositiveButton("yes", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        Intent i=new Intent(getBaseContext(), s.class);
        startActivity(i);
    }
});

AlertDialog a=b.create();

a.show();

Button bq = a.getButton(DialogInterface.BUTTON_NEGATIVE);  
bq.setBackgroundColor(Color.BLUE);
9
ASP

nous pouvons changer la couleur du texte du bouton de dialogue d'alerte en utilisant le style.

 AlertDialog.Builder dialog = new AlertDialog.Builder(context, R.style.yourDialog);
    dialog.setTitle(R.string.title);
    dialog.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            //code here 
        }
    });
    dialog.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            //do here 
        }
    });

    dialog.show();

Style.xml

<style name="yourDialog" parent="Theme.AppCompat.Light.Dialog.Alert">

    <item name="Android:colorAccent">@color/themeColor</item>
    <item name="Android:colorPrimary">@color/themeColor</item>

</style>
4
Abdul Rizwan

Je pense qu'il y a des développeurs qui souhaitent étendre la classe AlertDialog et définir les couleurs des boutons avec la définition de classe. À cette fin, vous pouvez utiliser ce code:

class MyDialog extends AlertDialog {
    public MyDialog(final Context context) {
        super(context); 
        setOnShowListener(new OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                Button negativeButton = getButton(DialogInterface.BUTTON_NEGATIVE);  
                Button positiveButton = getButton(DialogInterface.BUTTON_POSITIVE);

                negativeButton.setBackgroundColor(Color.GREEN);
                positiveButton.setBackgroundColor(Color.RED);
            }
        });
    }
}
2
Gabriel
    //el resto
    AlertDialog a=alertDialog.create();
    cambiar_color_texto_alertdialog(a);

}

public void cambiar_color_texto_alertdialog(AlertDialog a){
    a.show();
    Button BN = a.getButton(DialogInterface.BUTTON_NEGATIVE);
    BN.setTextColor(parseColor("#2E9AFE"));
    Button BA = a.getButton(DialogInterface.BUTTON_POSITIVE);
    BA.setTextColor(parseColor("#2E9AFE"));
}
2
camiso

si vous utilisez DialogFragment (Android.app.DialogFragment), vous pouvez remplacer la méthode onStart pour obtenir la poignée de tous les boutons (positifs, négatifs et neutres).

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    View eventEditDialogView = View.inflate(this.getActivity(), R.layout.event_edit_dialog,
                                            null);

    builder.setTitle(getLocalizedString("edit_event"))
            .setView(eventEditDialogView)
            .setPositiveButton(getLocalizedString("all_events"), new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {
                }
            })
            .setNegativeButton(getLocalizedString("this_event"), new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                }
            })
    return builder.create();
}

 @Override
    public void onStart() {
        super.onStart();
    Button positive = ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE);
    positive.setTextColor(Color.BLACK);
    positive.setBackgroundColor(getResources().getColor(R.color.GrayBGColor));
}

Toutes les solutions ci-dessus fonctionneront avec AlertDialog ou Dialog créé sur la même activité ou Fragment mais pas sur DialogFragment créé séparément.

1
Sachiin Gupta

Pour changer la couleur des boutons du dialogue AlertDialog

Code:

// Initialize AlertDialog & AlertDialog Builder
AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);
builder.setTitle(R.String.AlertDialogTitle);
...........
......... 
//Build your AlertDialog 
AlertDialog Demo_alertDialog= builder.create();
Demo_alertDialog.show();

//For Positive Button:
Button b_pos; 
b_pos=Demo_alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
if(b_pos!=null){
   b_pos.setTextColor(getResources().getColor(R.color.YourColor));
   }    


//For Neutral Button:
Button b_neu;
b_neu=Demo_alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL);
if(b_neu!=null){
   b_neu.setTextColor(getResources().getColor(R.color.YourColor));
   }

//For Negative Button:
Button b_neg;
b_neg=Demo_alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
if(b_neg!=null){
   b_neg.setTextColor(getResources().getColor(R.color.YourColor));
   }
1
Venkatesh Selvam

La couleur des boutons et autres textes peut également être modifiée en utilisant appcompat:

<style name="AlertDialogCustom" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="Android:colorPrimary">@color/flexdrive_blue_1</item>
    <item name="Android:textColorPrimary">@color/flexdrive_blue_6</item>
    <item name="Android:colorAccent">@color/flexdrive_blue_1</item>
    <item name="colorPrimaryDark">@color/flexdrive_blue_4</item>
</style>
1
Arade

non, vous ne pouvez pas changer la couleur ou les images ou l'arrière-plan des boutons par défaut des boîtes d'alerte. Pour la personnalisation, vous devrez vous créer une boîte de dialogue personnalisée comme celle-ci.

public class TryAgainAlert extends Dialog implements OnClickListener
{
    @Override
 public boolean onKeyDown(int keyCode, KeyEvent event)
 {
  if (keyCode == KeyEvent.KEYCODE_BACK)
  {   

   Intent i = new Intent(getApplicationContext(), MainMenu.class);
   finish();
   startActivity(i);

   return true;
  }
  return super.onKeyDown(keyCode, event);
 }


    TextView scores;
    Button tryagain,mainmenu,submit;


     public TryAgainAlert(Context context) {
        super(context);

        setContentView(R.layout.tryagainalert);

        scores=(TextView)findViewById(R.id.text);



        tryagain= (Button) findViewById(R.id.trya);
        mainmenu= (Button) findViewById(R.id.submitscore);
        submit= (Button) findViewById(R.id.mainmenu);

    }


    @Override
    public void onClick(View v) {
        if(v == tryagain)
        {

        else if (v==mainmenu)
        {


        }
        else if (v == submit)
        {

        }
    }

}

vous pouvez faire ce que vous voulez avec le fichier XML. J'espère que cela aidera. Merci

0
Jawad Amjad