Come posso cambiare il colore del testo del pulsante di dialogo predefinito in Android 5


160

Ho molte finestre di avviso nella mia app. È un layout predefinito ma sto aggiungendo pulsanti positivi e negativi alla finestra di dialogo. Quindi i pulsanti ottengono il colore di testo predefinito di Android 5 (verde). Ho provato a cambiarlo senza successo. Qualche idea su come cambiare quel colore di testo?

La mia finestra di dialogo personalizzata:

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

    } }

Creare la finestra di dialogo:

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

Quel negativeButton è un pulsante di dialogo predefinito e prende il colore verde predefinito da Android 5 Lollipop.

Grazie molto

Finestra di dialogo personalizzata con pulsante verde


Quasi duplicato domanda / risposta stackoverflow.com/a/29810469/2291 che ritengo sia più applicabile in questi giorni.
Jon Adams,

Risposte:


191

Puoi provare a creare AlertDialogprima l' oggetto, quindi utilizzarlo per impostare la modifica del colore del pulsante e quindi mostrarlo. (Nota che buildersull'oggetto invece di chiamare show()chiamiamo create()per ottenere l' AlertDialogoggetto:

//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()

Il motivo per cui devi farlo onShow()e non puoi semplicemente ottenere quel pulsante dopo aver creato la finestra di dialogo è che il pulsante non sarebbe stato ancora creato.

Ho cambiato AlertDialog.BUTTON_POSITIVEper AlertDialog.BUTTON_NEGATIVEriflettere il cambiamento nella tua domanda. Anche se è strano che il pulsante "OK" sia negativo. Di solito è il pulsante positivo.


Grazie per la risposta, ma non ho questo metodo in AlertDialog. Vedi il mio post aggiornato.
FOMDeveloper

5
Tale metodo è nella classe AlertDialog, non nella classe Builder. Quindi, invece di chiamare Builder.show (), puoi Builder.create (), che restituisce la classe AlertDialog. Quindi impostare il listener e quindi chiamare show () sull'oggetto
AlertDialog

3
Ma ci deve essere un altro modo per farlo. Sembra che sia un colore dal tema, possiamo cambiarlo attraverso il tema / lo stile?
milosmns,

Questo è perfetto. Appena provato in Xamarin. Android e funziona perfettamente. Grazie mille.
Perozzo,

282

Ecco un modo naturale per farlo con gli stili:

Se il tuo AppThemeè ereditato da Theme.MaterialComponents, quindi:

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

Se il tuo AppThemeè ereditato da 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>

Usa il tuo AlertDialogThemenel tuoAppTheme

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

o nel costruttore

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

34
Ho dovuto cambiare buttonBarNegativeButtonStyle in Android: buttonBarNegativeButtonStyle e buttonBarPositiveButtonStyle in android: buttonBarPositiveButtonStyle. Quindi ha funzionato (API 21+).
Vlad

23
Ricorda di utilizzare android.support.v7.app.AlertDialog invece di android.app.AlertDialog. L'errore di
cazzate

2
Ho dovuto cambiare il genitore di AlertDialogTheme in "Base.Theme.AppCompat.Light.Dialog.Alert". E rimuovi buttonBarNegativeButtonStyle e buttonBarPositiveButtonStyle. Aggiungi anche <item name = "colorAccent"> @ color / dashboard_red_color </item> in AlertDialogTheme. funziona perfettamente.
Zefiro,

3
Questo non funziona quando si utilizza la nuova libreria di materiali com.google.android.material:material:1.0.0-beta01e sto usando Theme.MaterialComponents.Light.Dialog.Alert
Sanjeev il

2
@LX ha aggiornato la risposta per includere il tema dei componenti materiali
Alexander Perfilyev,

120

Il colore dei pulsanti e altro testo può anche essere modificato tramite il tema:

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

Il risultato:

Dialogo Date picker


1
Attualmente non conosco un modo per cambiare il colore della casella di controllo o solo il colore del pulsante. Il colore dell'accento li cambia entrambi.
Peceps,

4
Mi è piaciuto questo approccio, ma sento che la risposta su stackoverflow.com/a/29810469/2291 è un modo leggermente più pulito per farlo.
Jon Adams,

12
Per farlo funzionare nel mio progetto, ho dovuto rimuovere la android:parte da android:alertDialogThemee verso android:colorAccent.
divieto di geoingegneria,

2
Avere Android: il prefisso sui valori dipende da dove metti styles.xml, in valori o in valori-vXX
peceps

1
Per farlo funzionare con AppCompat e una semplice cartella di valori, segui semplicemente le modifiche suggerite da @ ban-geoengineering
Felix,

94

La soluzione più semplice è:

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

4
Quei campi non dovrebbero essere referenziati dalla variabile non statica, dovrebbero essere AlertDialog.BUTTON_NEGATIVEecc.
Joe Maher,

Questo è stato il modo migliore e più semplice per farlo. Si noti che non ho usato il "creare" piuttosto afferrato il dialogo dopo lo spettacolo (). Come AlertDialog dialog = builder.show ();
Stephen McCormick,

2
Mentre questa soluzione potrebbe funzionare, logicamente è difettosa. Quello che succede qui è prima mostrare la finestra di dialogo e poi cambiarne l'aspetto. Dipende dall'implementazione sottostante (che potrebbe essere modificata nel tempo) e dalle prestazioni del dispositivo, si potrebbe teoricamente vedere un "sfarfallio" in cui l'utente visualizza una finestra di dialogo e quindi cambiare rapidamente il suo aspetto.
trungdinhtrong,

31

Esistono due modi per cambiare il colore del pulsante della finestra di dialogo.

Modo base

Se vuoi solo cambiare in un'attività, scrivi le due righe seguenti dopo alertDialog.show();

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

Consigliato

Ti consiglio di aggiungere un tema per AlertDialogin styles.xmlcosì non dovrai scrivere più e più volte lo stesso codice in ogni chiamata di attività / dialogo. Puoi semplicemente creare uno stile e applicare quel tema nella finestra di dialogo. Quindi, ogni volta che vuoi cambiare il colore della finestra di dialogo AlertDialog, cambia colore in styles.xml e tutte le finestre di dialogo verranno aggiornate nell'intera applicazione.

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

E applica il tema in AlertDialog.Builder

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

Questa risposta è la più chiara pur essendo corretta.
Big_Chair il

11

Se vuoi cambiare il colore del testo dei pulsanti (positivo, negativo, neutro) aggiungi semplicemente il tuo stile di dialogo personalizzato:

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

Quindi, il tuo stile di dialogo deve essere simile al seguente:

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

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

Il colore dei pulsanti e altri testi possono anche essere cambiati usando appcompat:


Theme.AppCompat.Light.Dialog.Alert funziona bene per cambiare il colore del pulsante in bianco.
Leo K,

6
  1. Nel tema / stile della tua app, aggiungi le seguenti righe:

    <item name="android:buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="android:buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
    <item name="android:buttonBarNeutralButtonStyle">@style/NeutralButtonStyle</item>
  2. Quindi aggiungi i seguenti stili:

    <style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
        <item name="android:textColor">@color/red</item>
    </style>
    
    <style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
        <item name="android:textColor">@color/red</item>
    </style>
    
    <style name="NeutralButtonStyle" 
    parent="Widget.MaterialComponents.Button.TextButton.Dialog">
        <item name="android:textColor">#00f</item>
    </style>

L'uso di questo metodo rende superfluo impostare il tema nel builder AlertDialog.


4

Proprio come una nota a margine:

I colori dei pulsanti (e dell'intero stile) dipendono anche dal tema corrente che può essere piuttosto diverso quando si utilizza uno dei due

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

o

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

(Meglio usare il secondo)


3

Ecco come lo fai: modo semplice

// Initializing a new alert dialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.message);
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        doAction();
    }
});
builder.setNegativeButton(R.string.cancel, null);

// Create the alert dialog and change Buttons colour
AlertDialog dialog = builder.create();
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface arg0) {
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.red));
        dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.blue));
        //dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(getResources().getColor(R.color.black));
    }
});
dialog.show();

1

per me era diverso, ho usato un tema pulsante

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

E perché

Android: textColor

era bianco lì ... non ho visto il testo dei pulsanti (anche i pulsanti della finestra di dialogo sono fondamentalmente pulsanti). eccoci, l'abbiamo cambiato, riparato.

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.