Material Design nie nadaje stylu ostrzeżeń w oknach dialogowych


161

Dodałem projekt materiału appCompat do mojej aplikacji i wygląda na to, że okna dialogowe z ostrzeżeniami nie używają moich kolorów podstawowych, podstawowych, ciemnych ani akcentujących.

Oto mój styl podstawowy:

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

Zgodnie z moim zrozumieniem, tekst przycisków dialogów powinien również używać tych kolorów. Czy źle rozumiem, czy jest jeszcze coś, co muszę zrobić?


Rozwiązanie:

Zaznaczona odpowiedź zaprowadziła mnie na właściwy tor.

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

Możesz wypróbować tę bibliotekę, którą stworzyłem: github.com/AndroidDeveloperLB/MaterialStuffLibrary
programista Androida

15
Czy dolna część ma być rozwiązaniem? Jeśli tak, opublikuj to jako własną odpowiedź , nie edytuj odpowiedzi w pytaniu.
Adi Inbar,

Odpowiedzi:


463

ZAKTUALIZOWANO w sierpniu 2019 r. Z biblioteką Material Components for Android:

Dzięki nowej bibliotece Material Components for Android możesz korzystać z nowej com.google.android.material.dialog.MaterialAlertDialogBuilderklasy, która jest rozszerzeniem istniejącej androidx.appcompat.AlertDialog.Builderklasy i zapewnia obsługę najnowszych specyfikacji Material Design.

Po prostu użyj czegoś takiego:

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

Możesz dostosować kolory rozszerzające ThemeOverlay.MaterialComponents.MaterialAlertDialogstyl:

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

Aby zastosować własny styl, użyj konstruktora:

new MaterialAlertDialogBuilder(context, R.style.CustomMaterialDialog)

wprowadź opis obrazu tutaj

Aby dostosować przyciski, tytuł i treść, sprawdź ten post, aby uzyskać więcej informacji.

Możesz także globalnie zmienić styl motywu aplikacji:

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

WSPARCIE LIBRARY i APPCOMPAT THEME:

Dzięki nowemu AppCompat v22.1możesz korzystać z nowego android.support.v7.app.AlertDialog .

Po prostu użyj takiego kodu:

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

I użyj takiego stylu:

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

W przeciwnym razie możesz zdefiniować w bieżącym motywie:

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

a następnie w swoim kodzie:

 import android.support.v7.app.AlertDialog

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

Tutaj AlertDialog na KitKat: wprowadź opis obrazu tutaj


2
Dlaczego wymuszać na AlertDialog.Builder używanie dokładnego motywu zamiast aktualizowania domyślnego? Wolałbym rozwiązać ten problem w styles.xml zamiast w kodzie Java.
Tomáš Hubálek

2
Czcionki tytułów i przycisków nie są pogrubione na urządzeniach sprzed wersji Lollipop.
jimmy0251

9
Musiałem <item name="android:alertDialogTheme">@style/AppCompatAlertDialogStyle</item>

1
+1 za doskonałą odpowiedź, ale jak mogę osiągnąć ten sam interfejs użytkownika dla wersji Androida poniżej Lollypop ... ponieważ z tym poniżej interfejs urządzenia wygląda tak dziwnie.
realpranav

1
dodaj import android.support.v7.app.AlertDialog działa
FlipNovid

9

podczas inicjowania konstruktora okien dialogowych podaj drugi parametr jako motyw. Automatycznie pokaże projekt materiału z poziomem API 21.

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

lub,

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

4

AppCompat nie robi tego w przypadku okien dialogowych (przynajmniej jeszcze nie)

EDYCJA: teraz. upewnij się, że używaszandroid.support.v7.app.AlertDialog


Wygląda na to, że możesz zmodyfikować style okien dialogowych za pomocą AppCompat
Matthew

moje Android Studio domyślnie nie dało mi import app.AlertDialogappCompat. Próbowałem dowiedzieć się, co jest nie tak przez około 40 minut, zanim faktycznie to sprawdzę ... Cholera Google!
Glorifind



1

Wypróbuj tę bibliotekę:

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

Jest oparty na DialogFragmentszamiast AlertDialogs(jak ten z @afollestad). Główna zaleta: dialogi nie zamykają się po rotacji, a wywołania zwrotne nadal działają.


Moja biblioteka ma znacznie większe możliwości. Zawsze możesz zawinąć okno dialogowe za pomocą DialogFragment. 😛
afollestad

1

Z jakiegoś powodu android: textColor wydaje się aktualizować tylko kolor tytułu. Możesz zmienić kolor tekstu wiadomości za pomocą pliku

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

0

Okna dialogowe ostrzeżeń dotyczących stylów Material Design: niestandardowa czcionka, przycisk, kolor i kształt, ...

 MaterialAlertDialogBuilder(requireContext(),
                R.style.MyAlertDialogTheme
            )
                .setIcon(R.drawable.ic_dialogs_24px)
                .setTitle("Feedback")
                //.setView(R.layout.edit_text)
                .setMessage("Do you have any additional comments?")
                .setPositiveButton("Send") { dialog, _ ->

                    val input =
                        (dialog as AlertDialog).findViewById<TextView>(
                            android.R.id.text1
                        )
                    Toast.makeText(context, input!!.text, Toast.LENGTH_LONG).show()

                }
                .setNegativeButton("Cancel") { _, _ ->
                    Toast.makeText(requireContext(), "Clicked cancel", Toast.LENGTH_SHORT).show()
                }
                .show()

Styl:

  <style name="MyAlertDialogTheme" parent="Theme.MaterialComponents.DayNight.Dialog.Alert">
  
        <item name="android:textAppearanceSmall">@style/MyTextAppearance</item>
        <item name="android:textAppearanceMedium">@style/MyTextAppearance</item>
        <item name="android:textAppearanceLarge">@style/MyTextAppearance</item>

        <item name="buttonBarPositiveButtonStyle">@style/Alert.Button.Positive</item>
        <item name="buttonBarNegativeButtonStyle">@style/Alert.Button.Neutral</item>
        <item name="buttonBarNeutralButtonStyle">@style/Alert.Button.Neutral</item>

        <item name="android:backgroundDimEnabled">true</item>

        <item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay.MyApp.Dialog.Rounded
        </item>

    </style>




    <style name="MyTextAppearance" parent="TextAppearance.AppCompat">
        <item name="android:fontFamily">@font/rosarivo</item>
    </style>


        <style name="Alert.Button.Positive" parent="Widget.MaterialComponents.Button.TextButton">
   <!--     <item name="backgroundTint">@color/colorPrimaryDark</item>-->
        <item name="backgroundTint">@android:color/transparent</item>
        <item name="rippleColor">@color/colorAccent</item>
        <item name="android:textColor">@color/colorPrimary</item>
       <!-- <item name="android:textColor">@android:color/white</item>-->
        <item name="android:textSize">14sp</item>
        <item name="android:textAllCaps">false</item>
    </style>


    <style name="Alert.Button.Neutral" parent="Widget.MaterialComponents.Button.TextButton">
        <item name="backgroundTint">@android:color/transparent</item>
        <item name="rippleColor">@color/colorAccent</item>
        <item name="android:textColor">@color/colorPrimary</item>
        <!--<item name="android:textColor">@android:color/darker_gray</item>-->
        <item name="android:textSize">14sp</item>
        <item name="android:textAllCaps">false</item>
    </style>


  <style name="ShapeAppearanceOverlay.MyApp.Dialog.Rounded" parent="">
        <item name="cornerFamily">rounded</item>
        <item name="cornerSize">8dp</item>
    </style>

Wynik: wprowadź opis obrazu tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.