Come utilizzare e personalizzare il nuovo AlertDialog da appCompat 22.1 e versioni successive


154

Sto cercando di migrare da Android predefinito AlertDialog a quello nuovo incluso in appCompat-22.1 Finora ho capito che devi solo importare un android.support.v7.app.AlertDialogpacchetto per usarlo.

Ma come posso modellarlo? Ad esempio, cambiare i colori dei pulsanti positivi / negativi, il colore del titolo, il colore del messaggio e il colore di sfondo?

Risposte:


448

Durante la creazione AlertDialogè possibile impostare un tema da utilizzare.

Esempio: creazione della finestra di dialogo

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 - Stile personalizzato

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

Risultato

log di avviso in stile

modificare

Per modificare l'aspetto del titolo, è possibile effettuare le seguenti operazioni. Per prima cosa aggiungi un nuovo stile:

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

successivamente fai semplicemente riferimento a questo stile nel tuo MyAlertDialogStyle:

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

In questo modo è possibile definire un diverso textColorper il messaggio tramite android:textColorPrimarye un diverso per il titolo tramite lo stile.


2
Grazie @reVerse Un'altra cosa. Molte librerie consentono di avere colori di titolo e testo diversi. Sai se questo è possibile anche qui?
ThanosFisherman,

3
Ciao di nuovo! C'è un modo per cambiare la dimensione del testo del messaggio?
ThanosFisherman,

1
@ThanosF Purtroppo non sono a conoscenza di alcun attributo xml che lo faccia. Ma è sicuramente possibile tramite Java-Code.
rispondi il

2
@summers Jup. Questa è fondamentalmente l'idea di appcompat-v7- porta indietro la compatibilità dei componenti più recenti fino al Livello API 7 (Android 2.1)
reVerse il

1
Per far funzionare il colore del testo dei pulsanti su 21+, ho dovuto disporre di un elemento android: buttonStyle su "MyAlertDialogStyle" e di un elemento android: textColor nello stile del pulsante personalizzato.
Tim Autin,

61

Per utilizzare un tema per tutte le applicazioni e non utilizzare il secondo parametro per definire la finestra di dialogo

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

Sulla mia app usando un accento di colore nel tema non mostrare i pulsanti di alertDialog con il tema colorAccent Devo aggiungere uno stile di dialogo nel tema.


Non funziona su API 10 (Android 2.3), probabilmente solo su API 11+.
Oliv

2
Forse su API 15+. Inizio un nuovo progetto solo su API 15+, penso che Android prima dei 4 sia obsoleto nel 2015.
neoteknic

@Oliv Funziona su API 10 usando la dipendenza com.android.support:design:23.2.1
passerby

IDEA afferma che è necessario API 21+ per utilizzare colorAccent su Base.Theme.AppCompat.Light.Dialog.Alert utilizzando 'com.android.support:design:22.2.1'
Felipe Andrade,

@Felipe Andrade Alway punta all'ultima versione dell'SDK, dovrebbe funzionare! Ho un progetto con api min 15 e design target 25: 22.x è obsoleto, usa 25.1.xe altro
neoteknic

19

Se vuoi usare il nuovo android.support.v7.app.AlertDialog e avere colori diversi per i pulsanti e avere anche un layout personalizzato, dai un'occhiata al mio 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;
}

inserisci qui la descrizione dell'immagine


È fantastico! Grazie
ThanosFisherman il

Grazie, questo è l'unico modo in cui ha funzionato per me, ma puoi dirmi come posso ottenere il colore anche per la casella di controllo? Nella mia app, c'è una finestra di dialogo con un elenco di pulsanti di opzione creati tramite Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener). Non voglio spingermi oltre la sottoclasse dell'adattatore e la modifica della vista lì.
Gabor,

l'artiglieria pesante è ciò che funziona sempre! Ho dovuto usarlo per occuparmi di 2 pulsanti ribelli che si sono sempre rifiutati di cambiare il colore dell'accento!
Rupps,

7

Segui la risposta @reVerse ma nel mio caso avevo già delle proprietà nel mio AppThemelike

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

Quindi il mio dialogo sarà simile
inserisci qui la descrizione dell'immagine

L'ho risolto

1) Modifica l'importazione da android.app.AlertDialoga android.support.v7.app.AlertDialog
2) I override 2 property in AppThemewith null value

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

Spero che aiuti un altro popolo

inserisci qui la descrizione dell'immagine


Ah grazie! Non stavo usando il supporto AlertDialog.
masterwok,

1

Se sei come me, vuoi solo modificare alcuni dei colori in AppCompat e l'unico colore che devi cambiare in modo univoco nella finestra di dialogo è lo sfondo. Quindi tutto ciò che devi fare è impostare un colore per colorBackgroundFloating.

Ecco il mio tema di base che modifica semplicemente alcuni colori senza temi nidificati:

    <style name="AppTheme" parent="Theme.AppCompat">
        <item name="colorPrimary">@color/theme_colorPrimary</item>
        <item name="colorPrimaryDark">@color/theme_colorPrimaryDark</item>
        <item name="colorAccent">@color/theme_colorAccent</item>
        <item name="colorControlActivated">@color/theme_colorControlActivated</item>
        <item name="android:windowBackground">@color/theme_bg</item>
        <item name="colorBackgroundFloating">@color/theme_dialog_bg</item><!-- Dialog background color -->
        <item name="colorButtonNormal">@color/theme_colorPrimary</item>
        <item name="colorControlHighlight">@color/theme_colorAccent</item>
    </style>

-3
    <item name="editTextColor">@color/white</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:textColorHint">@color/gray</item>
    <item name="android:textColorPrimary">@color/gray</item>
    <item name="colorControlNormal">@color/gray</item>
    <item name="colorControlActivated">@color/white</item>
    <item name="colorControlHighlight">#30FFFFFF</item>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.