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
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.
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)
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:
[._____ extrait de code
dialog.show(); //Only after .show() was called
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(neededColor);
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(neededColor);
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);
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>
<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:
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)
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é.