web-dev-qa-db-fra.com

Comment modifier la couleur du texte du bouton de la boîte de dialogue par défaut dans Android 5

J'ai plusieurs dialogues d'alerte dans mon application. C'est une disposition par défaut, mais j'ajoute des boutons positifs et négatifs à la boîte de dialogue. Ainsi, la couleur de texte par défaut de Android 5 (vert) est attribuée aux boutons. J'ai essayé de le changer sans succès. Une idée de comment changer cette couleur de texte?

Mon dialogue personnalisé:

public class MyCustomDialog extends AlertDialog.Builder {

    public MyCustomDialog(Context context,String title,String message) {
        super(context);

        LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        View viewDialog = inflater.inflate(R.layout.dialog_simple, null, false);

        TextView titleTextView = (TextView)viewDialog.findViewById(R.id.title);
        titleTextView.setText(title);
        TextView messageTextView = (TextView)viewDialog.findViewById(R.id.message);
        messageTextView.setText(message);

        this.setCancelable(false);

        this.setView(viewDialog);

    } }

Création du dialogue:

MyCustomDialog builder = new MyCustomDialog(getActivity(), "Try Again", errorMessage);
builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            ...
                        }
}).show();

Ce bouton négatif est un bouton de dialogue par défaut et prend la couleur verte par défaut de Android 5 Lollipop.

Merci beaucoup

Custom dialog with green button

120
FOMDeveloper

Vous pouvez commencer par essayer de créer l’objet AlertDialog, puis de l’utiliser pour modifier la couleur du bouton, puis l’afficher. (Notez que sur l'objet builder au lieu d'appeler show(), nous appelons create() pour obtenir l'objet AlertDialog:

//1. create a dialog object 'dialog'
MyCustomDialog builder = new MyCustomDialog(getActivity(), "Try Again", errorMessage); 
AlertDialog dialog = builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    ...
                }

            }).create();

//2. now setup to change color of the button
dialog.setOnShowListener( new OnShowListener() {
    @Override
    public void onShow(DialogInterface arg0) {
        dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(COLOR_I_WANT);
    }
});

dialog.show()

La raison pour laquelle vous devez le faire sur onShow() et que vous ne pouvez pas obtenir uniquement ce bouton après avoir créé votre boîte de dialogue est que le bouton n'aurait pas encore été créé.

J'ai changé AlertDialog.BUTTON_POSITIVE en AlertDialog.BUTTON_NEGATIVE pour refléter le changement de votre question. Bien qu'il soit étrange que le bouton "OK" soit un bouton négatif. D'habitude c'est le bouton positif.

155
trungdinhtrong

Voici une façon naturelle de le faire avec des styles:

Si votre AppTheme est hérité de Theme.MaterialComponents, alors:

<style name="AlertDialogTheme" parent="ThemeOverlay.MaterialComponents.Dialog.Alert">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>

<style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="Android:textColor">#f00</item>
</style>

<style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="Android:textColor">#00f</item>
</style>

Si votre AppTheme est hérité de Theme.AppCompat:

<style name="AlertDialogTheme" parent="ThemeOverlay.AppCompat.Dialog.Alert">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>

<style name="NegativeButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
    <item name="Android:textColor">#f00</item>
</style>

<style name="PositiveButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
    <item name="Android:textColor">#00f</item>
</style>

Utilisez votre AlertDialogTheme dans votre AppTheme

<item name="alertDialogTheme">@style/AlertDialogTheme</item>

ou en constructeur

androidx.appcompat.app.AlertDialog.Builder(context, R.style.AlertDialogTheme)
193
Alexander Perfilyev

La couleur des boutons et des autres textes peut également être modifiée via le thème:

values-21/styles.xml

<style name="AppTheme" parent="...">
  ...
  <item name="Android:timePickerDialogTheme">@style/AlertDialogCustom</item>
  <item name="Android:datePickerDialogTheme">@style/AlertDialogCustom</item>
  <item name="Android:alertDialogTheme">@style/AlertDialogCustom</item>
</style>

<style name="AlertDialogCustom" parent="Android:Theme.Material.Light.Dialog.Alert">
  <item name="Android:colorPrimary">#00397F</item>
  <item name="Android:colorAccent">#0AAEEF</item>
</style>

Le résultat:

DialogDate picker

111
peceps

[._____ extrait de code

dialog.show(); //Only after .show() was called
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(neededColor);
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(neededColor);
80
Artemiy

Il y a deux façons de changer la couleur du bouton de la boîte de dialogue.

moyen simple

Si vous voulez seulement changer d'activité, écrivez les deux lignes ci-dessous après alertDialog.show();

alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.colorPrimary));
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.colorPrimaryDark));

Recommandé

Je vous recommande d'ajouter un thème pour AlertDialog dans styles.xml afin que vous n'ayez pas à écrire le même code encore et encore à chaque appel d'activité/dialogue. Vous pouvez simplement créer un style et appliquer ce thème dans la boîte de dialogue. Ainsi, chaque fois que vous souhaitez modifier la couleur de la boîte AlertDialog, il vous suffit de changer la couleur dans le fichier styles.xml. Toutes les boîtes de dialogue seront mises à jour dans toute l'application.

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

Et appliquez le thème dans AlertDialog.Builder

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AlertDialogTheme);
18
Hassnain Jamil

Si vous souhaitez modifier la couleur du texte des boutons (positif, négatif, neutre), ajoutez-le simplement à votre style de dialogue personnalisé:

<item name="colorAccent">@color/accent_color</item>

Donc, votre style de dialogue doit ressembler à ceci:

<style name="AlertDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="Android:textColor">@Android:color/black</item>
    <item name="colorAccent">@color/topeka_accent</item>
</style>
9
Stanislav Zakharov
<style name="AlertDialogCustom" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="Android:colorPrimary">#00397F</item>
    <item name="Android:textColorPrimary">#22397F</item>
    <item name="Android:colorAccent">#00397F</item>
    <item name="colorPrimaryDark">#22397F</item>
</style>

La couleur des boutons et de tout autre texte peut également être modifiée à l'aide de appcompat:

6
Arade

Juste comme note de côté:

Les couleurs des boutons (et le style entier) dépendent également du thème actuel, qui peut être assez différent lorsque vous utilisez

     Android.app.AlertDialog.Builder builder = new AlertDialog.Builder()

ou

    Android.support.v7.app.AlertDialog.Builder builder = new AlertDialog.Builder()

(mieux utiliser le second)

4
Tobias

pour moi c'était différent, j'ai utilisé un thème de bouton

<style name="ButtonLight_pink" parent="Android:Widget.Button">
      <item name="Android:background">@drawable/light_pink_btn_default_holo_light</item>
      <item name="Android:minHeight">48dip</item>
      <item name="Android:minWidth">64dip</item>
      <item name="Android:textColor">@color/tab_background_light_pink</item>
    </style>

et parce que

Android: textColor

c'était blanc là… Je n'ai vu aucun texte de bouton (les boutons de dialogue sont aussi des boutons). on y va, on l'a changé, on l'a réparé.

1
cV2