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.