Recientemente cambié de la biblioteca de soporte a com.google.android.material: material: 1.0.0
Pero ahora tengo un problema, en estas páginas hay una nota https://github.com/material-components/material-components-android/blob/master/docs/getting-started.md
Nota: El uso de un tema de Componentes de material habilita un inflador de vista personalizado que reemplaza los componentes predeterminados con sus homólogos de Material. Actualmente, esto solo reemplaza los componentes Button XML con MaterialButton.
Y el tema que estoy usando
Theme.MaterialComponents.Light.NoActionBar
hace exactamente lo que dice en esa nota, reemplaza AlertDialog Buttons a MaterialButtons pero el problema es que, por defecto, MaterialButtons tiene un fondo de color y ahora los botones se ven así:
¿Cómo puedo volver a hacerlos sin bordes y sin fondo?
PD: estoy usando el generador de alertas para crear diálogos de alerta:
android.app.AlertDialog.Builder
Respuestas:
Descubrí qué estaba causando este problema. Necesito usar una clase diferente de AlertDialog:
androidx.appcompat.app.AlertDialog
Cuando cambié a esto, todo comenzó a funcionar como se esperaba. Aquí es donde encontré la solución:
https://github.com/material-components/material-components-android/issues/162
fuente
Al usar
com.google.android.material:material:1.0.0
yandroidx.appcompat.app.AlertDialog
puede personalizar cada botón en elbuttonBar
usandoWidget.MaterialComponents.Button.TextButton
como padre.val builder: AlertDialog.Builder = AlertDialog.Builder(ContextThemeWrapper(context, R.style.AlertDialogTheme))
Utilice el diseño predeterminado o agregue uno personalizado
builder.setView(R.layout.my_dialog)
En tus estilos:
<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>
fuente
MaterialAlertDialogBuilder
en su lugar.Si está utilizando la biblioteca de Componentes de materiales, la mejor forma de tener una
AlertDialog
es utilizar la extensiónMaterialAlertDialogBuilder
.new MaterialAlertDialogBuilder(context) .setTitle("Dialog") .setMessage("Lorem ipsum dolor ....") .setPositiveButton("Ok", /* listener = */ null) .setNegativeButton("Cancel", /* listener = */ null) .show();
Es el resultado predeterminado:
Si también desea aplicar un estilo o color diferente a los botones, puede verificar esta respuesta .
fuente
AlertDialog.Builder
conMaterialAlertDialogBuilder
no cambió el color de los botones. Consulte las respuestas a continuación para cambiar eltheme
.Probé las respuestas anteriores. Aunque tuve una buena idea, ninguna funcionó para mi caso. Entonces, esta es mi respuesta.
Asegúrese de tener
android:theme="@style/AppMaterialTheme"
en su archivo de manifiesto en Aplicación o Actividad.Abra su archivo Styles.xml y cámbielo según lo siguiente.
<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>
No necesitará aplicar el tema a su AlertDialog ya que su Actividad le aplica el tema. Entonces, cree el diálogo normalmente.
El resultado será.
fuente
Primero, es mejor usar use MaterialAlertDialog si está usando Material Theme.
Puede leer más aquí - Material.io → Diálogos de temas
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()
Este es el layout.xml de las acciones MaterialAlertDialog. Como puede ver, hay 3 botones y cada uno tiene su propio estilo. Entonces, así es como puede cambiarlos.
Paso 1: Dígale a Android que desea modificar el tema MaterialAlertDialog predeterminado .
<style name="Base.AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> ... <item name="materialAlertDialogTheme">@style/AlertDialog</item> ... </style>
Paso 2: Dígale a Android que desea modificar un estilo de botón específico.
buttonBarNeutralButtonStyle
,buttonBarNegativeButtonStyle
obuttonBarPositiveButtonStyle
<style name="AlertDialog" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog"> <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item> </style>
Paso 3: define tu estilo personalizado
<style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton"> <item name="android:textColor">#FF0000</item> </style>
fuente
Encontré otra solución para esto usando MaterialComponents aquí: 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>
Aunque todavía no es un "comportamiento previsto" para mí.
fuente
Si no desea usar
androidx.appcompat.app.AlertDialog
, puede simplemente redefinir el estilo de los botones de diálogo:En su 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"/>
fuente
Si está utilizando la
com.android.support:design:28.0.0
biblioteca, el usoandroid.support.v7.app.AlertDialog
funciona como se esperaba.fuente