android - personalizado - Estilo de botón en AlertDialogs
dialog fragment android (6)
¿Alguien sabe cómo anular el estilo predeterminado para los botones de AlertDialog? Busqué themes y styles la fuente de Android y experimenté con diferentes cosas, pero no he podido encontrar una manera que funcione.
Lo que tengo a continuación funciona para cambiar los fondos, pero no hace nada con los botones. myTheme
se aplica a toda la <application>
través del manifiesto. (Algunos otros elementos se eliminaron para mayor claridad, pero solo se refieren a la barra de título)
<style name="myTheme" parent="android:Theme">
<item name="android:buttonStyle">@style/customButtonStyle</item>
<item name="android:alertDialogStyle">@style/dialogAlertTheme</item>
</style>
<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert">
<item name="android:fullDark">@drawable/dialog_loading_background</item>
<item name="android:topDark">@drawable/dialog_alert_top</item>
<item name="android:centerDark">@drawable/dialog_alert_center</item>
<item name="android:bottomDark">@drawable/dialog_alert_bottom</item>
<!-- this last line makes no difference to the buttons -->
<item name="android:buttonStyle">@style/customButtonStyle</item>
</style>
¿Algunas ideas?
Dado que el razonamiento de MrSnowflake es inexacto, me estoy tomando la libertad de proporcionar otra respuesta.
Hay algo mal con el marcado en la pregunta de Steve Haley, y está mezclando alertDialogStyle y alertDialogTheme, probablemente debido al hecho de que alertDialogTheme se introdujo mucho después de que existiera alertDialogStyle.
Así que incluso si @android: style / Theme.Dialog.Alert está disponible en su plataforma Andoid, aún no puede utilizar su poder expresivo conectando una versión personalizada a su propio tema a menos que su plataforma Android admita un atributo de android: alertDialogTheme / tema para los temas. (Puede o no darse el caso de que existan versiones de Android tan inconsistentes, no lo sé con seguridad. Pero el marcado utilizado en la pregunta sugiere que sí existe).
En el marcado de la pregunta, parent = "@ android: style / Theme.Dialog.Alert" no hará nada excepto crear la ilusión de que está personalizando el tema del diálogo de alerta cuando en realidad solo está personalizando el estilo del diálogo de alerta.
Así es como debe verse el marcado; No todas las versiones de Android admiten todas las funciones.
<style name="myTheme" parent="android:Theme">
<item name="android:buttonStyle">@style/customButtonStyle</item>
<item name="android:alertDialogStyle">@style/dialogAlertStyle</item>
<item name="android:alertDialogTheme">@style/dialogAlertTheme</item>
</style>
<style name="dialogAlertStyle" parent="@android:style/AlertDialog">
<item name="android:fullDark">[...]</item>
[...]
</style>
<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert">
<item name="android:windowBackground">[...]</item>
[...]
</style>
La personalización del estilo de diálogo de alerta ha existido durante bastante tiempo, pero se limita a proporcionar dibujables (de fondo) para "fullDark", "topDark", etc.
La personalización del tema del diálogo de alerta abre un método para proporcionar atributos como windowBackground, windowTitleStyle y similares, pero como se indicó anteriormente, necesita una versión de Android que admita el atributo / elemento alertDialogThem para los temas. No puedo saber exactamente cuándo se introdujo, pero no ha sido Android 2.2 y Eclipse te lo dirá de todos modos ...
No tengo los recursos para validar la conclusión de MrSnowflake de que es imposible diseñar los botones de diálogo de alerta en XML, pero a menos que estemos enfrentando uno de esos aspectos un tanto desagradables de Android en los que realmente falta una función, me parece poco probable.
De hecho, lo que falta en la pregunta es la parte más relevante a este respecto, a saber:
<style name="customButtonStyle" />
así que la conclusión de que los botones de diálogo de alerta no obedecen al Widget.Button aún no se ha probado desde mi punto de vista.
Conclusión consolidada: las capacidades para diseñar diálogos de alerta independientemente de otros widgets están limitadas en Android pero se vuelven más poderosas a medida que las nuevas versiones mejoran a este respecto.
Hice un método como este que cambiará los colores y el fondo predeterminados de los botones.
public static void setDefaultColorTextForDialogButton(AlertDialog alertDialog, Resources r) {
Button b;
b= alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
if(b != null) {
b.setTextColor(r.getColor(R.color.default_text));
b.setBackgroundColor(Color.WHITE);
}
b = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
if(b != null) {
b.setTextColor(r.getColor(R.color.default_text));
b.setBackgroundColor(Color.WHITE);
}
b = alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL);
if(b != null) {
b.setTextColor(r.getColor(R.color.default_text));
b.setBackgroundColor(Color.WHITE);
}
}
Esto podría ser útil para algunas personas !!!
Prueba esto:
<item name="buttonBarStyle">@style/Widget.AppCompat.ButtonBar</item>
<item name="buttonBarButtonStyle">@style/AppTheme.Button</item>
<item name="buttonBarPositiveButtonStyle">@style/YoursTheme</item>
<item name="buttonBarNegativeButtonStyle">@style/YoursTheme</item>
<item name="buttonBarNeutralButtonStyle">@style/YoursTheme</item>
Puede anular "buttonBarButtonStyle" en lugar de "buttonStyle" de esta manera:
<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert">
<item name="android:buttonBarButtonStyle">@style/customButtonStyle</item>
</style>
Si está utilizando componentes de material:
<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:alertDialogTheme">@style/AlertDialogTheme.Light</item>
</style>
<style name="AlertDialogTheme.Light" parent="ThemeOverlay.MaterialComponents.Dialog.Alert" >
<item name="android:buttonBarButtonStyle">@style/InsertCustomButtonStyleHere</item>
</style>
Esto mantendrá los colores de su tema pero reemplazará el estilo de los botones, por ejemplo, para que coincida con Widget.MaterialComponents.Button.TextButton
.
Vea todos los otros anwsers abajo.
Incorrecto:
Supongo que tienes que implementar tu propia clase de Dialog
.