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:
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
źródło
Odpowiedzi:
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
źródło
Podczas używania
com.google.android.material:material:1.0.0
iandroidx.appcompat.app.AlertDialog
możesz dostosować każdy przycisk wbuttonBar
, używającWidget.MaterialComponents.Button.TextButton
jako 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>
źródło
MaterialAlertDialogBuilder
zamiast tego.Jeśli używasz biblioteki Komponenty materiałów, najlepszym sposobem na uzyskanie pliku
AlertDialog
jest użycieMaterialAlertDialogBuilder
.new MaterialAlertDialogBuilder(context) .setTitle("Dialog") .setMessage("Lorem ipsum dolor ....") .setPositiveButton("Ok", /* listener = */ null) .setNegativeButton("Cancel", /* listener = */ null) .show();
To jest domyślny wynik:
Jeśli chcesz również zastosować inny styl lub kolor do przycisków, możesz zaznaczyć tę odpowiedź .
źródło
AlertDialog.Builder
zMaterialAlertDialogBuilder
nie zmienić kolor przycisków. Zobacz odpowiedzi poniżej, aby zmienićtheme
.Przetestowałem powyższe odpowiedzi. Chociaż mam dobry pomysł, żaden nie zadziałał w moim przypadku. Więc to jest moja odpowiedź.
Upewnij się, że
android:theme="@style/AppMaterialTheme"
w pliku manifestu znajduje się aplikacja lub aktywność.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>
Nie musisz stosować motywu do swojego AlertDialog, ponieważ Twoja aktywność stosuje do niego motyw. Więc utwórz okno dialogowe normalnie.
Wynik będzie.
źródło
Po pierwsze, lepiej jest użyć MaterialAlertDialog, jeśli używasz motywu materiału.
Możesz przeczytać więcej tutaj - Material.io → Theming dialogs
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
,buttonBarNegativeButtonStyle
lubbuttonBarPositiveButtonStyle
<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>
źródło
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”.
źródło
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"/>
źródło
Jeśli używasz
com.android.support:design:28.0.0
biblioteki, używanieandroid.support.v7.app.AlertDialog
działa zgodnie z oczekiwaniami.źródło