web-dev-qa-db-fra.com

Comment utiliser et styler le nouvel AlertDialog à partir d'appCompat 22.1 et supérieur

J'essaie de migrer de la configuration par défaut Android AlertDialog vers la nouvelle version incluse dans appCompat-22.1. Jusqu'à présent, je comprends qu'il vous suffit d'importer le package Android.support.v7.app.AlertDialog pour l'utiliser.

Mais comment puis-je le nommer? Par exemple, changez la couleur du bouton positif/négatif, la couleur du titre, la couleur du message et la couleur de l’arrière-plan?

145
ThanosFisherman

Lors de la création de la AlertDialog, vous pouvez définir un thème à utiliser.

Exemple - Création du dialogue

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.MyAlertDialogStyle);
builder.setTitle("AppCompatDialog");
builder.setMessage("Lorem ipsum dolor...");
builder.setPositiveButton("OK", null);
builder.setNegativeButton("Cancel", null);
builder.show();

styles.xml - Style personnalisé

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    <!-- Used for the buttons -->
    <item name="colorAccent">#FFC107</item>
    <!-- Used for the title and text -->
    <item name="Android:textColorPrimary">#FFFFFF</item>
    <!-- Used for the background -->
    <item name="Android:background">#4CAF50</item>
</style>

Résultat

styled alertdialog

Éditer

Pour modifier l’apparence du titre, vous pouvez procéder comme suit. Ajoutez d'abord un nouveau style:

<style name="MyTitleTextStyle">
    <item name="Android:textColor">#FFEB3B</item>
    <item name="Android:textAppearance">@style/TextAppearance.AppCompat.Title</item>
</style>

ensuite, il vous suffit de référencer ce style dans votre MyAlertDialogStyle:

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    ...
    <item name="Android:windowTitleStyle">@style/MyTitleTextStyle</item>
</style>

De cette façon, vous pouvez définir un autre textColor pour le message via Android:textColorPrimary et un autre pour le titre via le style.

432
reVerse

Pour utiliser un thème pour toute l'application et ne pas utiliser le second paramètre pour styler votre boîte de dialogue

<style name="MyTheme" parent="Base.Theme.AppCompat.Light">
    <item name="alertDialogTheme">@style/dialog</item>
    <item name="colorAccent">@color/accent</item>
</style>

<style name="dialog" parent="Base.Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorAccent">@color/accent</item>
</style>

Sur mon application utilisant un accent de couleur dans le thème ne montre pas les boutons de alertDialog avec le thème colorAccent Je dois ajouter un style de dialogue dans le thème.

57
neoteknic

Si vous souhaitez utiliser le nouveau Android.support.v7.app.AlertDialog et avoir des couleurs différentes pour les boutons et également une présentation personnalisée, consultez ma https://Gist.github.com/JoachimR/6bfbc175d5c8116d411e

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.custom_layout, null);

    initDialogUi(v);

    final AlertDialog d = new AlertDialog.Builder(activity, R.style.AppCompatAlertDialogStyle)
            .setTitle(getString(R.string.some_dialog_title))
            .setCancelable(true)
            .setPositiveButton(activity.getString(R.string.some_dialog_title_btn_positive),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            doSomething();
                            dismiss();
                        }
                    })
            .setNegativeButton(activity.getString(R.string.some_dialog_title_btn_negative),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dismiss();
                        }
                    })
            .setView(v)
            .create();

    // change color of positive button         
    d.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(DialogInterface dialog) {
            Button b = d.getButton(DialogInterface.BUTTON_POSITIVE);
            b.setTextColor(getResources().getColor(R.color.colorPrimary));
        }
    });

    return d;
}

enter image description here

19
IHeartAndroid

Suivez la réponse de @reVerse mais dans mon cas, j'avais déjà quelques propriétés dans mon AppTheme like

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...
    <item name="Android:textColor">#111</item>
    <item name="Android:textSize">13sp</item>
</style>

Donc, mon dialogue va ressembler
enter image description here

Je l'ai résolu par

1) Modifiez l'importation de Android.app.AlertDialog en Android.support.v7.app.AlertDialog
2) Je remplace la propriété 2 dans AppTheme avec une valeur nulle

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    <!-- Used for the buttons -->
    <item name="colorAccent">#FFC107</item>
    <!-- Used for the title and text -->
    <item name="Android:textColorPrimary">#FFFFFF</item>
    <!-- Used for the background -->
    <item name="Android:background">#4CAF50</item>


    <item name="Android:textColor">@null</item>
    <item name="Android:textSize">@null</item>
</style>

.

AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.MyAlertDialogStyle);

J'espère que ça aidera un autre peuple

enter image description here

6
Phan Van Linh