Verwendung und Stil des neuen AlertDialogs ab AppCompat 22.1


154

Ich versuche, von Standard-Android AlertDialogauf das neue in AppCompat-22.1 enthaltene zu migrieren. Bisher müssen Sie meines Erachtens nur android.support.v7.app.AlertDialogPakete importieren , um es zu verwenden.

Aber wie kann ich es stylen? Zum Beispiel die positiven / negativen Tastenfarben, Titelfarbe, Nachrichtenfarbe und Hintergrundfarbe ändern?

Antworten:


448

Beim Erstellen des können AlertDialogSie ein zu verwendendes Thema festlegen.

Beispiel - Erstellen des Dialogs

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

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

Ergebnis

gestylter alertdialog

Bearbeiten

Um das Erscheinungsbild des Titels zu ändern, haben Sie folgende Möglichkeiten. Fügen Sie zuerst einen neuen Stil hinzu:

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

Verweisen Sie anschließend einfach auf diesen Stil in Ihrem MyAlertDialogStyle:

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

Auf diese Weise können Sie eine andere textColorfür die Nachricht über android:textColorPrimaryund eine andere für den Titel über den Stil definieren.


2
Vielen Dank @reVerse Noch eine Sache. In vielen Bibliotheken können unterschiedliche Titel- und Textfarben verwendet werden. Wissen Sie, ob dies auch hier möglich ist?
ThanosFisherman

3
Hallo nochmal! Gibt es eine Möglichkeit, die Textgröße der Nachricht zu ändern?
ThanosFisherman

1
@ThanosF Leider sind mir keine XML-Attribute bekannt, die dies tun. Aber es ist sicherlich über Java-Code möglich.
ReVerse

2
@summers Jup. Das ist im Grunde die Idee von appcompat-v7- es bringt die Abwärtskompatibilität neuerer Komponenten auf API Level 7 (Android 2.1)
am

1
Damit die Textfarbe der Schaltflächen auf 21+ funktioniert, musste ich ein android: buttonStyle-Element für "MyAlertDialogStyle" und ein android: textColor-Element im benutzerdefinierten Schaltflächenstil haben.
Tim Autin

61

Verwenden Sie ein Thema für die gesamte Anwendung und verwenden Sie nicht den zweiten Parameter, um Ihren Dialog zu gestalten

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

Wenn Sie in meiner App einen Farbakzent im Thema verwenden, werden die Schaltflächen des alertDialogs nicht mit dem Thema colorAccent angezeigt. Ich muss dem Thema einen Dialogstil hinzufügen.


Funktioniert nicht mit API 10 (Android 2.3), wahrscheinlich nur mit API 11+.
Oliv

2
Vielleicht auf API 15+. Ich starte ein neues Projekt nur auf API 15+. Ich denke, dass Android vor 4 im Jahr 2015 veraltet ist.
Neoteknic

@Oliv Es funktioniert auf API 10 mit der Abhängigkeit com.android.support:design:23.2.1
Passanten

IDEA sagt, dass API 21+ erforderlich ist, um colorAccent auf Base.Theme.AppCompat.Light.Dialog.Alert mit 'com.android.support:design:22.2.1' zu verwenden
Felipe Andrade

@Felipe Andrade Immer das Ziel der neuesten SDK-Version, es sollte funktionieren! Ich habe ein Projekt mit min api 15 und Ziel 25 Design: 22.x ist veraltet, benutze 25.1.x und mehr
neoteknic

19

Wenn Sie den neuen android.support.v7.app.AlertDialog verwenden möchten und unterschiedliche Farben für die Schaltflächen sowie ein benutzerdefiniertes Layout haben möchten, besuchen Sie meine 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;
}

Geben Sie hier die Bildbeschreibung ein


Das ist großartig! Vielen Dank
ThanosFisherman

Danke, nur so hat es bei mir funktioniert, aber können Sie mir sagen, wie ich auch die Farbe für das Kontrollkästchen erhalten kann? In meiner App gibt es einen Dialog mit einer Liste von Optionsfeldern, die über erstellt wurden Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener). Ich möchte nicht so weit gehen, den Adapter zu unterklassifizieren und die Ansicht dort zu optimieren.
Gabor

Schwere Artillerie ist das, was immer funktioniert! Ich musste dies verwenden, um mich um 2 Rebellenknöpfe zu kümmern, die sich immer weigerten, zur Akzentfarbe zu wechseln!
Rupps

7

Folgen Sie der Antwort von @reVerse, aber in meinem Fall hatte ich bereits eine Eigenschaft in meinem AppThemeLike

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

So wird mein Dialog aussehen
Geben Sie hier die Bildbeschreibung ein

Ich habe es gelöst durch

1) Ändern Sie den Import von android.app.AlertDialogin android.support.v7.app.AlertDialog
2) Ich überschreibe 2 Eigenschaften AppThememit Nullwert

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

Hoffe es hilft einem anderen Volk

Geben Sie hier die Bildbeschreibung ein


Ah, Danke! Ich habe den Support AlertDialog nicht verwendet.
Masterwok

1

Wenn Sie wie ich sind, möchten Sie nur einige der Farben in AppCompat ändern. Die einzige Farbe, die Sie im Dialogfeld eindeutig ändern müssen, ist der Hintergrund. Dann müssen Sie nur noch eine Farbe für festlegen colorBackgroundFloating.

Hier ist mein Grundthema, das einfach einige Farben ohne verschachtelte Themen ändert:

    <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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.