Przyciski dialogowe ostrzeżeń motywu MaterialComponents

83

Niedawno przestawiłem się z biblioteki wsparcia na com.google.android.material: material: 1.0.0

Ale teraz mam problem, na tej stronie jest notatka https://github.com/material-components/material-components-android/blob/master/docs/getting-started.md

Uwaga: Użycie motywu Komponenty materiału włącza inflater widoku niestandardowego, który zastępuje komponenty domyślne ich odpowiednikami Materiał. Obecnie zastępuje to tylko składniki Button XML z MaterialButton.

I motyw, którego używam

Theme.MaterialComponents.Light.NoActionBar

robi dokładnie to, co jest napisane w tej notatce, zastępuje AlertDialog Buttons na MaterialButtons, ale problem polega na tym, że domyślnie MaterialButtons mają kolorowe tło, a teraz przyciski wyglądają tak: wprowadź opis obrazu tutaj

Jak sprawić, by były znowu bez obramowania i tła?

PS Używam narzędzia do tworzenia alertów do tworzenia okien dialogowych z alertami:

android.app.AlertDialog.Builder
antanas_sepikas
źródło
Możesz użyć motywu Bridge, jeśli chcesz, aby zawartość motywu AppCompat zawierała nowe style interfejsu Material UI, może rozwiązać Twój problem, odnieś się do mojej odpowiedzi: stackoverflow.com/a/52401497/10271334
Jeel Vankhede

Odpowiedzi:

114

Dowiedziałem się, co powoduje ten problem. Muszę użyć innej klasy AlertDialog:

androidx.appcompat.app.AlertDialog

Kiedy przeszedłem na to wszystko zaczęło działać zgodnie z oczekiwaniami. Oto gdzie znalazłem rozwiązanie:

https://github.com/material-components/material-components-android/issues/162

antanas_sepikas
źródło
2
Migrowałem mój kod do androidx przy użyciu opcji / funkcji „Migrate to AndroidX” w Android Studio, ale ta biblioteka nie została automatycznie zaktualizowana do AndroidX. Ten problem został rozwiązany, gdy zaktualizowałem import ręcznie, jak sugeruje odpowiedź
sushrut619
1
Ratujesz mnie! Dzięki!
Mateus
Nie wszyscy bohaterowie noszą peleryny!
dave o grady
Krótko przed północą wielkie dzięki. Zaoszczędziłeś mi godzinę snu.
Nantoka
76

Podczas używania com.google.android.material:material:1.0.0i androidx.appcompat.app.AlertDialogmożesz dostosować każdy przycisk w buttonBar, używając Widget.MaterialComponents.Button.TextButtonjako rodzica.

val builder: AlertDialog.Builder = AlertDialog.Builder(ContextThemeWrapper(context, R.style.AlertDialogTheme))

Użyj domyślnego układu lub dodaj niestandardowy według builder.setView(R.layout.my_dialog)

W twoich stylach:

<style name="AlertDialogTheme" parent="Theme.MaterialComponents.Light.Dialog.Alert">
    <item name="buttonBarPositiveButtonStyle">@style/Alert.Button.Positive</item>
    <item name="buttonBarNegativeButtonStyle">@style/Alert.Button.Neutral</item>
    <item name="buttonBarNeutralButtonStyle">@style/Alert.Button.Neutral</item>
</style>

<style name="Alert.Button.Positive" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="backgroundTint">@color/transparent</item>
    <item name="rippleColor">@color/colorAccent</item>
    <item name="android:textColor">@color/colorPrimary</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">@color/transparent</item>
    <item name="rippleColor">@color/colorAccent</item>
    <item name="android:textColor">@color/gray_dark</item>
    <item name="android:textSize">14sp</item>
</style>

Zrzut ekranu

Obrabować
źródło
1
To jest to, czego szukałem, próbując stylizować moje dialogi. Wszystkie znalezione odpowiedzi nie dotyczyły AndroidX.
LeonardoSibela
2
Nie jestem tylko pewien, dlaczego ustawiasz textAllCaps na false. Zwykle widzę, że to prawda w oknach dialogowych (jedynym wyjątkiem był przykład Material Design z Google o nazwie Crane)
LeonardoSibela
5
Chciałbym móc zagłosować za tym 50 razy. Spędziłem dwie godziny próbując pokolorować głupie dialogi. Zauważ, że powinieneś także użyć MaterialAlertDialogBuilderzamiast tego.
gMale
1
Komentarz @gMale pozwolił mi zaoszczędzić czas.
funct7
1
Dziękuję, to naprawdę pomogło!
Grisgram
21

Jeśli używasz biblioteki Komponenty materiałów, najlepszym sposobem na uzyskanie pliku AlertDialogjest użycie MaterialAlertDialogBuilder.

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

To jest domyślny wynik:

wprowadź opis obrazu tutaj

Jeśli chcesz również zastosować inny styl lub kolor do przycisków, możesz zaznaczyć tę odpowiedź .

Gabriele Mariotti
źródło
Wymiana AlertDialog.Builderz MaterialAlertDialogBuildernie zmienić kolor przycisków. Zobacz odpowiedzi poniżej, aby zmienić theme.
CoolMind
@CoolMind Nie chodzi o to, jak zmienić kolor przycisku.
Gabriele Mariotti
13

Przetestowałem powyższe odpowiedzi. Chociaż mam dobry pomysł, żaden nie zadziałał w moim przypadku. Więc to jest moja odpowiedź.

  1. Upewnij się, że android:theme="@style/AppMaterialTheme"w pliku manifestu znajduje się aplikacja lub aktywność.

  2. Otwórz plik Styles.xml i zmień go w następujący sposób.

    <style name="AppMaterialTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <item name="colorPrimary">@color/primaryBlue</item>
        <item name="colorPrimaryDark">@color/primaryBlue</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="colorControlActivated">@color/primaryBlue</item>
        <item name="colorControlHighlight">@color/colorAccent_main</item>
        <item name="colorButtonNormal">@color/white</item>
    
        <item name="materialAlertDialogTheme">@style/AlertDialogMaterialTheme</item>
    </style>
    
    <style name="AlertDialogMaterialTheme" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog">
        <item name="buttonBarPositiveButtonStyle">@style/Alert.Button.Positive</item>
        <item name="buttonBarNegativeButtonStyle">@style/Alert.Button.Negative</item>
    </style>
    
    <style name="Alert.Button.Positive" parent="Widget.MaterialComponents.Button.UnelevatedButton">
        <item name="android:fillColor">@color/color_0054BB</item>
        <item name="android:textColor">@color/white</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:textSize">14sp</item>
        <item name="rippleColor">@color/colorAccent_main</item>
    </style>
    
    <style name="Alert.Button.Negative" parent="Widget.MaterialComponents.Button.OutlinedButton">
        <item name="strokeColor">@color/color_0054BB</item>
        <item name="android:textColor">@color/color_0054BB</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:textSize">14sp</item>
        <item name="android:layout_marginEnd">8dp</item>
        <item name="rippleColor">@color/colorAccent_main</item>
    </style>
    

  3. Nie musisz stosować motywu do swojego AlertDialog, ponieważ Twoja aktywność stosuje do niego motyw. Więc utwórz okno dialogowe normalnie.

wprowadź opis obrazu tutaj

Wynik będzie.

wprowadź opis obrazu tutaj

Hesam
źródło
Nie wiem dlaczego, ponieważ „buttonBarPositiveButtonStyle” nie działa dla mnie, ale „android: buttonBarPositiveButtonStyle” działa poprawnie.
Łukasz Taraszka
Styl nie ma zastosowania do PositiveButton. To samo z negatywnym.
Łukasz Taraszka
11

Po pierwsze, lepiej jest użyć MaterialAlertDialog, jeśli używasz motywu materiału.

Możesz przeczytać więcej tutaj - Material.io → Theming dialogs

wprowadź opis obrazu tutaj

MaterialAlertDialogBuilder(context)
            .setTitle(R.string.confirm)
            .setMessage(R.string.logout)
            .setPositiveButton(R.string.logout_alert_positive) { _, _ -> activity?.logout() }
            .setNegativeButton(R.string.never_mind, null)
            .show()

 

To jest layout.xml akcji MaterialAlertDialog. Jak widać są 3 przyciski i każdy ma swój własny styl. Oto jak możesz je zmienić.

Krok 1: Powiedz Androidowi, że chcesz zmienić domyślny motyw MaterialAlertDialog .

<style name="Base.AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    ...
    <item name="materialAlertDialogTheme">@style/AlertDialog</item>
    ...
</style>

Krok 2: Powiedz Androidowi, że chcesz zmienić określony styl przycisku. buttonBarNeutralButtonStyle, buttonBarNegativeButtonStylelubbuttonBarPositiveButtonStyle

<style name="AlertDialog" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
</style>

Krok 3: Zdefiniuj swój własny styl

<style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="android:textColor">#FF0000</item>
</style>
arsent
źródło
6

Znalazłem inne rozwiązanie tego problemu za pomocą MaterialComponents tutaj: https://issuetracker.google.com/issues/116861837#comment9

<style name="Theme.Custom.Material.Alert.Dialog.Light" parent="Theme.MaterialComponents.Light.Dialog.Alert">
    <item name="materialButtonStyle">@style/Widget.AppCompat.Button.Borderless</item>
</style>

<style name="Theme.Custom.Material.Base.Light" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="android:dialogTheme">@style/Theme.Custom.Material.Alert.Dialog.Light</item>
    <item name="android:alertDialogTheme">@style/Theme.Custom.Material.Alert.Dialog.Light</item>
  ....
</style>

Chociaż nadal nie jest to „zamierzone zachowanie”.

szermierka
źródło
5

Jeśli nie chcesz używać androidx.appcompat.app.AlertDialog, możesz po prostu przedefiniować styl przycisków dialogowych:

W Twoim style.xml:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
   ...
   <item name="android:buttonBarButtonStyle">@style/DialogButton</item>
   ...
</style>

<style name="DialogButton" parent="Widget.MaterialComponents.Button.TextButton"/>

Sylvain Lagache
źródło
4

Jeśli używasz com.android.support:design:28.0.0biblioteki, używanie android.support.v7.app.AlertDialogdziała zgodnie z oczekiwaniami.

Tamoksyna
źródło