Kürzlich habe ich von der Support-Bibliothek zu com.google.android.material gewechselt: material: 1.0.0
Aber jetzt habe ich ein Problem, auf diesen Seiten gibt es einen Hinweis https://github.com/material-components/material-components-android/blob/master/docs/getting-started.md
Hinweis: Die Verwendung eines Themas "Materialkomponenten" aktiviert einen benutzerdefinierten Ansichts-Inflater, der Standardkomponenten durch ihre Material-Gegenstücke ersetzt. Derzeit werden dadurch nur Button-XML-Komponenten durch MaterialButton ersetzt.
Und das Thema, das ich benutze
Theme.MaterialComponents.Light.NoActionBar
Wenn Sie genau das tun, was in dieser Notiz angegeben ist, werden die AlertDialog-Schaltflächen durch MaterialButtons ersetzt. Das Problem besteht jedoch darin, dass MaterialButtons standardmäßig farbig im Hintergrund angezeigt werden und die Schaltflächen nun folgendermaßen aussehen:
Wie kann ich sie wieder randlos und hintergrundlos machen?
PS Ich verwende den Alert Builder, um Alert-Dialoge zu erstellen:
android.app.AlertDialog.Builder
quelle
Antworten:
Ich fand heraus, was dieses Problem verursachte. Ich muss eine andere AlertDialog-Klasse verwenden:
androidx.appcompat.app.AlertDialog
Als ich dazu wechselte, fing alles an, wie erwartet zu funktionieren. Hier habe ich die Lösung gefunden:
https://github.com/material-components/material-components-android/issues/162
quelle
Bei der Verwendung
com.google.android.material:material:1.0.0
und könnenandroidx.appcompat.app.AlertDialog
Sie jede Schaltfläche in derbuttonBar
OptionWidget.MaterialComponents.Button.TextButton
als übergeordnetes Element anpassen .val builder: AlertDialog.Builder = AlertDialog.Builder(ContextThemeWrapper(context, R.style.AlertDialogTheme))
Verwenden Sie das Standardlayout oder fügen Sie ein benutzerdefiniertes Layout hinzu
builder.setView(R.layout.my_dialog)
In Ihren Stilen:
<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>
quelle
MaterialAlertDialogBuilder
stattdessen auch verwenden sollten .Wenn Sie die Material Components-Bibliothek verwenden, verwenden Sie am besten
AlertDialog
dieMaterialAlertDialogBuilder
.new MaterialAlertDialogBuilder(context) .setTitle("Dialog") .setMessage("Lorem ipsum dolor ....") .setPositiveButton("Ok", /* listener = */ null) .setNegativeButton("Cancel", /* listener = */ null) .show();
Dies ist das Standardergebnis:
Wenn Sie den Schaltflächen auch einen anderen Stil oder eine andere Farbe zuweisen möchten, können Sie diese Antwort überprüfen .
quelle
AlertDialog.Builder
durch wurdeMaterialAlertDialogBuilder
die Farbe der Schaltflächen nicht geändert. Siehe Antworten unten, um die zu änderntheme
.Ich habe die obigen Antworten getestet. Obwohl ich eine gute Idee hatte, funktionierte keine für meinen Fall. Das ist also meine Antwort.
Stellen Sie sicher, dass Sie
android:theme="@style/AppMaterialTheme"
in Ihrer Manifestdatei unter Anwendung oder Aktivität haben.Öffnen Sie Ihre Styles.xml-Datei und ändern Sie sie wie folgt.
<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>
Sie müssen das Thema nicht auf Ihren AlertDialog anwenden, da Ihre Aktivität das Thema darauf anwendet. Erstellen Sie den Dialog also normal.
Das Ergebnis wird sein.
quelle
Erstens ist es besser, MaterialAlertDialog zu verwenden wenn Sie Material Theme verwenden.
Weitere Informationen finden Sie hier - Material.io → Themendialoge
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()
Dies ist die layout.xml der MaterialAlertDialog-Aktionen. Wie Sie sehen können, gibt es 3 Schaltflächen und jede hat ihren eigenen Stil. Hier erfahren Sie, wie Sie sie ändern können.
Schritt 1: Teilen Sie Android mit, dass Sie das Standard- MaterialAlertDialog- Design ändern möchten .
<style name="Base.AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> ... <item name="materialAlertDialogTheme">@style/AlertDialog</item> ... </style>
Schritt 2: Teilen Sie Android mit, dass Sie einen bestimmten Schaltflächenstil ändern möchten.
buttonBarNeutralButtonStyle
,buttonBarNegativeButtonStyle
oderbuttonBarPositiveButtonStyle
<style name="AlertDialog" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog"> <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item> </style>
Schritt 3: Definieren Sie Ihren benutzerdefinierten Stil
<style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton"> <item name="android:textColor">#FF0000</item> </style>
quelle
Hier finden Sie eine andere Lösung für die Verwendung von MaterialComponents: 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>
Obwohl es für mich immer noch kein "beabsichtigtes Verhalten" ist.
quelle
Wenn Sie nicht verwenden möchten
androidx.appcompat.app.AlertDialog
, können Sie einfach den Stil der Dialogschaltflächen neu definieren:In Ihrer 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"/>
quelle
Wenn Sie die
com.android.support:design:28.0.0
Bibliothek verwenden,android.support.v7.app.AlertDialog
funktioniert die Verwendung wie erwartet.quelle