Wie kann ich die Textfarbe der Standarddialogschaltfläche in Android 5 ändern?

159

Ich habe viele Warndialoge in meiner App. Es ist ein Standardlayout, aber ich füge dem Dialogfeld positive und negative Schaltflächen hinzu. So erhalten die Schaltflächen die Standardtextfarbe von Android 5 (grün). Ich habe versucht, es ohne Erfolg zu ändern. Irgendeine Idee, wie man diese Textfarbe ändert?

Mein benutzerdefinierter Dialog:

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

    } }

Dialog erstellen:

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

Dieser negative Button ist eine Standarddialogschaltfläche und übernimmt die grüne Standardfarbe von Android 5 Lollipop.

Danke vielmals

Benutzerdefinierter Dialog mit grüner Schaltfläche

FOMDeveloper
quelle
Fast doppelte Frage / Antwort stackoverflow.com/a/29810469/2291 , die meiner Meinung nach heutzutage besser anwendbar ist.
Jon Adams

Antworten:

190

Sie können versuchen, das AlertDialogObjekt zuerst zu erstellen und es dann so einzurichten, dass die Farbe der Schaltfläche geändert und dann angezeigt wird. (Beachten Sie, dass wir für ein builderObjekt anstelle eines Aufrufs show()aufrufen create(), um das AlertDialogObjekt abzurufen:

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

Der Grund, warum Sie dies tun müssen onShow()und diese Schaltfläche nach dem Erstellen Ihres Dialogfelds nicht einfach erhalten können, ist, dass die Schaltfläche noch nicht erstellt wurde.

Ich habe mich geändert AlertDialog.BUTTON_POSITIVE, AlertDialog.BUTTON_NEGATIVEum die Änderung in Ihrer Frage widerzuspiegeln. Obwohl es seltsam ist, dass die Schaltfläche "OK" eine negative Schaltfläche ist. Normalerweise ist es der positive Knopf.

trungdinhtrong
quelle
Vielen Dank für Ihre Antwort, aber ich habe diese Methode nicht in AlertDialog. Siehe meinen aktualisierten Beitrag.
FOMDeveloper
5
Diese Methode befindet sich in der AlertDialog-Klasse und nicht in der Builder-Klasse. Anstatt Builder.show () aufzurufen, können Sie Builder.create () verwenden, das die AlertDialog-Klasse zurückgibt. Sie richten dann den Listener ein und rufen dann show () für das AlertDialog-Objekt auf
trungdinhtrong
3
Aber es muss einen anderen Weg geben, dies zu tun. Scheint, als wäre es eine Farbe aus dem Thema. Können wir sie durch das Thema / den Stil ändern?
Milosmns
Dies ist perfekt. Gerade in Xamarin.Android ausprobiert und es funktioniert perfekt. Vielen Dank.
Perozzo
278

Hier ist eine natürliche Möglichkeit, dies mit Stilen zu tun:

Wenn Ihr AppThemegeerbt wird Theme.MaterialComponents, dann:

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

Wenn Ihr AppThemegeerbt wird von 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>

Verwenden Sie Ihre AlertDialogThemein IhremAppTheme

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

oder im Konstruktor

androidx.appcompat.app.AlertDialog.Builder(context, R.style.AlertDialogTheme)
Alexander Perfilyev
quelle
34
Ich musste buttonBarNegativeButtonStyle in android: buttonBarNegativeButtonStyle und buttonBarPositiveButtonStyle in android: buttonBarPositiveButtonStyle ändern. Dann hat es funktioniert (API 21+).
Vlad
23
Denken Sie daran, android.support.v7.app.AlertDialog anstelle von android.app.AlertDialog zu verwenden. Bullshit Fehler dauerte ich 2 Stunden
thanhbinh84
2
Ich musste das übergeordnete Element von AlertDialogTheme in "Base.Theme.AppCompat.Light.Dialog.Alert" ändern. Und entfernen Sie buttonBarNegativeButtonStyle & buttonBarPositiveButtonStyle. Fügen Sie außerdem <item name = "colorAccent"> @ color / dashboard_red_color </ item> in AlertDialogTheme hinzu. nd funktioniert perfekt.
Zephyr
3
Dies funktioniert nicht, wenn eine neue Materialbibliothek verwendet wird com.google.android.material:material:1.0.0-beta01und ich Theme.MaterialComponents.Light.Dialog.Alert
Sanjeev
2
@LX aktualisierte Antwort, um Materialkomponenten Thema aufzunehmen
Alexander Perfilyev
120

Die Farbe der Schaltflächen und anderer Texte kann auch über das Thema geändert werden:

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>

Das Ergebnis:

Dialog Datumsauswahl

Peceps
quelle
1
Derzeit weiß ich nicht, wie ich die Farbe des Kontrollkästchens oder der Schaltfläche ändern kann. Die Akzentfarbe ändert beide.
Peceps
4
Ich mochte diesen Ansatz, aber ich denke, die Antwort unter stackoverflow.com/a/29810469/2291 ist ein etwas sauberer Weg, dies zu tun.
Jon Adams
12
Damit dies in meinem Projekt funktioniert, musste ich das android:Teil von android:alertDialogThemeund entfernen android:colorAccent.
Ban-Geoengineering
2
Das Präfix android: für die Werte hängt davon ab, wo Sie die Datei styles.xml in Werten oder in values-vXX ablegen
peceps
1
Damit dies mit AppCompat und einem einfachen Werteordner funktioniert, folgen Sie einfach den Änderungen, die von @ ban-geoengineering
Felix
94

Die einfachste Lösung ist:

dialog.show(); //Only after .show() was called
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(neededColor);
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(neededColor);
Artemiy
quelle
4
Diese Felder sollten nicht von der nicht statischen Variablen referenziert werden, sollten AlertDialog.BUTTON_NEGATIVEusw. sein
Joe Maher
Dies war der beste und einfachste Weg, dies zu tun. Beachten Sie, dass ich nicht das "Erstellen" verwendet habe, sondern den Dialog nach der Show () gepackt habe. Wie AlertDialog dialog = builder.show ();
Stephen McCormick
2
Obwohl diese Lösung möglicherweise funktioniert, ist sie logischerweise fehlerhaft. Was hier passiert, ist, dass Sie zuerst den Dialog anzeigen und dann sein Erscheinungsbild ändern. Abhängig von der zugrunde liegenden Implementierung (die im Laufe der Zeit geändert werden kann) und der Leistung des Geräts kann theoretisch ein "Flimmern" angezeigt werden, bei dem der Benutzer ein Dialogfeld sieht und dann schnell sein Erscheinungsbild ändert.
Trungdinhtrong
31

Es gibt zwei Möglichkeiten, die Farbe der Dialogschaltfläche zu ändern.

Grundlegender Weg

Wenn Sie nur eine Aktivität ändern möchten, schreiben Sie die folgenden zwei Zeilen danach alertDialog.show();

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

Empfohlen

Ich empfehle, ein Thema für AlertDialogin hinzuzufügen, styles.xmldamit Sie nicht bei jedem Aktivitäts- / Dialogaufruf immer wieder denselben Code schreiben müssen. Sie können einfach einen Stil erstellen und dieses Thema auf das Dialogfeld anwenden. Wenn Sie also die Farbe des AlertDialog-Felds ändern möchten, ändern Sie einfach die Farbe in styles.xml. Alle Dialogfelder werden in der gesamten Anwendung aktualisiert.

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

Und wende das Thema in an AlertDialog.Builder

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AlertDialogTheme);
Hassnain Jamil
quelle
Diese Antwort ist die sauberste und dennoch korrekt.
Big_Chair
11

Wenn Sie die Textfarbe der Schaltflächen ändern möchten (positiv, negativ, neutral), fügen Sie einfach Ihren benutzerdefinierten Dialogstil hinzu:

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

Ihr Dialogstil muss also folgendermaßen aussehen:

<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>
Stanislav Zakharov
quelle
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>

Die Farbe der Schaltflächen und anderer Texte kann auch mit appcompat geändert werden:

Arade
quelle
Theme.AppCompat.Light.Dialog.Alert funktioniert gut, um die Tastenfarbe in Weiß zu ändern.
Leo K
6
  1. Fügen Sie im Thema / Stil Ihrer App die folgenden Zeilen hinzu:

    <item name="android:buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="android:buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
    <item name="android:buttonBarNeutralButtonStyle">@style/NeutralButtonStyle</item>
  2. Fügen Sie dann die folgenden Stile hinzu:

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

Mit dieser Methode ist es nicht erforderlich, das Thema im Builder für AlertDialog festzulegen.

Joe Muller
quelle
4

Nur als Randnotiz:

Die Farben der Schaltflächen (und des gesamten Stils) hängen auch vom aktuellen Thema ab, das bei Verwendung unterschiedlich sein kann

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

oder

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

(Besser den zweiten verwenden)

Tobias
quelle
3

So geht's: Einfach

// 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();
MrGuy
quelle
1

Für mich war es anders, ich habe ein Button-Thema verwendet

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

und weil

android: textColor

war dort weiß ... ich habe keinen Schaltflächentext gesehen (Dialogschaltflächen sind im Grunde auch Schaltflächen). los geht's, geändert, repariert.

cV2
quelle