Material Design ohne Styling-Warndialoge

161

Ich habe das AppCompat-Materialdesign zu meiner App hinzugefügt und es scheint, dass die Warnungsdialoge nicht meine Primär-, Primärdunkel- oder Akzentfarben verwenden.

Hier ist mein Grundstil:

<style name="MaterialNavyTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/apptheme_color</item>
    <item name="colorPrimaryDark">@color/apptheme_color_dark</item>
    <item name="colorAccent">@color/apptheme_color</item>
    <item name="android:textColorPrimary">@color/action_bar_gray</item>
</style>

Nach meinem Verständnis sollte der Text der Dialogschaltfläche auch diese Farben verwenden. Liege ich falsch in meinem Verständnis oder muss ich noch etwas tun?


Lösung:

Die markierte Antwort brachte mich auf den richtigen Weg.

<style name="MaterialNavyTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/apptheme_color</item>
    <item name="colorPrimaryDark">@color/apptheme_color_dark</item>
    <item name="colorAccent">@color/apptheme_color</item>
    <item name="android:actionModeBackground">@color/apptheme_color_dark</item>
    <item name="android:textColorPrimary">@color/action_bar_gray</item>
    <item name="sdlDialogStyle">@style/DialogStyleLight</item>
    <item name="android:seekBarStyle">@style/SeekBarNavyTheme</item>
</style>

<style name="StyledDialog" parent="Theme.AppCompat.Light.Dialog">
    <item name="colorPrimary">@color/apptheme_color</item>
    <item name="colorPrimaryDark">@color/apptheme_color_dark</item>
    <item name="colorAccent">@color/apptheme_color</item>
</style>
Matthew
quelle
Sie können diese Bibliothek ausprobieren, die ich erstellt habe: github.com/AndroidDeveloperLB/MaterialStuffLibrary
Android-Entwickler
15
Soll der untere Teil die Lösung sein? Wenn ja, posten Sie es als Selbstantwort , bearbeiten Sie die Antwort nicht in der Frage.
Adi Inbar

Antworten:

463

AKTUALISIERT AM Aug 2019 MIT Die Materialkomponenten für die Android-Bibliothek:

Mit den neuen Materialkomponenten für die Android-Bibliothek können Sie die neue com.google.android.material.dialog.MaterialAlertDialogBuilderKlasse verwenden, die von der vorhandenen androidx.appcompat.AlertDialog.BuilderKlasse abweicht und Unterstützung für die neuesten Material Design-Spezifikationen bietet.

Verwenden Sie einfach so etwas:

new MaterialAlertDialogBuilder(context)
            .setTitle("Dialog")
            .setMessage("Lorem ipsum dolor ....")
            .setPositiveButton("Ok", /* listener = */ null)
            .setNegativeButton("Cancel", /* listener = */ null)
            .show();

Sie können die Farben anpassen, um den ThemeOverlay.MaterialComponents.MaterialAlertDialogStil zu erweitern:

  <style name="CustomMaterialDialog" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
     <!-- Background Color-->
     <item name="android:background">#006db3</item>
     <!-- Text Color for title and message -->
     <item name="colorOnSurface">@color/secondaryColor</item>
     <!-- Text Color for buttons -->
     <item name="colorPrimary">@color/white</item> 
     ....
  </style>  

Um Ihren benutzerdefinierten Stil anzuwenden, verwenden Sie einfach den Konstruktor:

new MaterialAlertDialogBuilder(context, R.style.CustomMaterialDialog)

Geben Sie hier die Bildbeschreibung ein

Weitere Informationen zum Anpassen der Schaltflächen, des Titels und des Textes finden Sie in diesem Beitrag .

Sie können den Stil in Ihrem App-Thema auch global ändern :

 <!-- Base application theme. -->
 <style name="AppTheme" parent="Theme.MaterialComponents.Light">
    ...
    <item name="materialAlertDialogTheme">@style/CustomMaterialDialog</item>
 </style>

MIT SUPPORT LIBRARY und APPCOMPAT THEMA:

Mit dem neuen können AppCompat v22.1Sie den neuen android.support.v7.app.AlertDialog verwenden .

Verwenden Sie einfach einen Code wie diesen:

import android.support.v7.app.AlertDialog

AlertDialog.Builder builder =
       new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle);
builder.setTitle("Dialog");
builder.setMessage("Lorem ipsum dolor ....");
builder.setPositiveButton("OK", null);
builder.setNegativeButton("Cancel", null);
builder.show();

Und verwenden Sie einen Stil wie diesen:

<style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
        <item name="colorAccent">#FFCC00</item>
        <item name="android:textColorPrimary">#FFFFFF</item>
        <item name="android:background">#5fa3d0</item>
    </style>

Andernfalls können Sie in Ihrem aktuellen Thema Folgendes definieren:

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- your style -->
    <item name="alertDialogTheme">@style/AppCompatAlertDialogStyle</item>
</style>

und dann in Ihrem Code:

 import android.support.v7.app.AlertDialog

    AlertDialog.Builder builder =
           new AlertDialog.Builder(this);

Hier der AlertDialog auf Kitkat: Geben Sie hier die Bildbeschreibung ein

Gabriele Mariotti
quelle
2
Warum sollte AlertDialog.Builder gezwungen werden, ein genaues Thema zu verwenden, anstatt das Standardthema zu aktualisieren? Ich würde es vorziehen, dieses Problem in styles.xml anstelle von Java-Code zu lösen.
Tomáš Hubálek
2
Titel- und Schaltflächen-Schriftarten sind auf Pre-Lollipop-Geräten nicht fett gedruckt.
Jimmy0251
9
Ich musste mit "android:" voranstellen, damit es funktioniert:<item name="android:alertDialogTheme">@style/AppCompatAlertDialogStyle</item>
1
+1 für eine hervorragende Antwort, aber wie kann ich die gleiche Benutzeroberfläche für die Android-Version unter Lollypop erreichen ... weil mit dieser Benutzeroberfläche unter dem Gerät so seltsam aussieht.
Realpranav
1
add import android.support.v7.app.AlertDialog funktioniert
FlipNovid
9

Übergeben Sie beim Initialisieren des Dialog Builders den zweiten Parameter als Thema. Das Materialdesign mit API-Level 21 wird automatisch angezeigt.

AlertDialog.Builder builder = new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE_DEFAULT_DARK);

oder,

AlertDialog.Builder builder = new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
Sandeep Kumar
quelle
4

AppCompat macht das nicht für Dialoge (zumindest noch nicht)

EDIT: tut es jetzt. Stellen Sie sicher, zu verwendenandroid.support.v7.app.AlertDialog

Nadavfima
quelle
Sieht so aus, als könnten Sie mit AppCompat
Matthew
Mein Android Studio gab mir standardmäßig import app.AlertDialognicht die AppCompat. Ich habe ungefähr 40 Minuten lang versucht herauszufinden, was los ist, bevor ich es tatsächlich überprüfe ... Verdammt, Sie googeln!
Glorifind
2

Sie können dieses Projekt in Betracht ziehen: https://github.com/fengdai/AlertDialogPro

Es kann Ihnen Warnungsdialoge für Materialthemen bieten, die fast denen von Lutschern entsprechen. Kompatibel mit Android 2.1.

Feng Dai
quelle
Nur eine Anmerkung: Diese Antwort ist älter als die akzeptierte.
rekire
1

Probieren Sie diese Bibliothek aus:

https://github.com/avast/android-styled-dialogs

Es basiert auf DialogFragmentsstatt AlertDialogs(wie das von @afollestad). Der Hauptvorteil: Dialoge werden nach der Rotation nicht geschlossen und Rückrufe funktionieren weiterhin.

David Vávra
quelle
Meine Bibliothek ist viel leistungsfähiger. Und Sie können einen Dialog jederzeit mit einem DialogFragment umschließen. 😛
afollestad
1

Aus irgendeinem Grund scheint das Android: textColor nur die Titelfarbe zu aktualisieren. Sie können die Farbe des Nachrichtentextes mithilfe von a ändern

SpannableString.AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.MyDialogTheme));

AlertDialog dialog = builder.create();
                Spannable wordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");
                wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                dialog.setMessage(wordtoSpan);
                dialog.show();
CaptRespect
quelle