example - android style theme dialog
Estilo AlertDialog: cómo cambiar el estilo(color) del título, mensaje, etc. (8)
Me he roto la cabeza por esto bastante. Lo que tengo que hacer es cambiar el estilo de todos los AlertDialog
en mi aplicación de Android: el fondo del diálogo debe ser blanco, y el texto debe ser negro. Traté de crear muchos estilos, temas y aplicaciones desde el código, manifiesto, etc., pero no AlertDialog
éxito, con respecto a los colores de texto dentro de AlertDialog
. En este momento, tengo el código más simple, establecido así:
Manifiesto:
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
styles.xml:
<style name="AppTheme" parent="AppBaseTheme"> <item name="android:alertDialogStyle">@style/DialogStyle</item> </style> <style name="DialogStyle" parent="@android:style/Theme.Dialog"> <!-- changing these background stuff works fine --> <item name="android:bottomBright">@android:color/white</item> <item name="android:bottomDark">@android:color/white</item> <item name="android:bottomMedium">@drawable/dialog_footer_bg</item> <item name="android:centerBright">@android:color/white</item> <item name="android:centerDark">@drawable/dialog_body_bg</item> <item name="android:centerMedium">@android:color/white</item> <item name="android:fullBright">@color/orange</item> <item name="android:fullDark">@color/orange</item> <item name="android:topBright">@color/green</item> <item name="android:topDark">@drawable/dialog_header_bg</item>
Los elementos enumerados a continuación no funcionan (por favor, lea los comentarios que he puesto arriba de cada elemento):
<!-- panelBackground is not getting set to null, there is something squarish around it --> <item name="android:panelBackground">@null</item> <!-- Setting this textColor doesn''t seem to have any effect at all. Messages, title, button text color, whatever; nothing changes. --> <item name="android:textColor">#000000</item> <!-- Also tried with textAppearance, as follows. Didn''t work --> <item name="android:textAppearance">?android:attr/textColorPrimaryInverse</item> <!-- Also tried changing textAppearancePrimary, to no avail --> <item name="android:textColorPrimary">#000000</item> <!-- Also need to change the dialog title text, tried it as follows, dint work: --> <item name="android:windowTitleStyle">@style/DialogWindowTitle</item> </style>
DialogWindowTitle se define de la siguiente manera:
<style name="DialogWindowTitle"> <item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item> </style>
Entonces ninguno de estos está funcionando. ¿Alguien puede decirme qué podría estar haciendo mal y cómo puedo:
- Cambiar el color del texto para los mensajes (texto de contenido)
- Cambiar el color del texto del título
- Eliminar el fondo del panel
Nota: Necesito soportar API 8 (2.2) hacia arriba. Además, he revisado la mayoría de las preguntas relacionadas aquí, y los grupos de google, pero no puedo entenderlo, ¡aunque tengo la sensación de que está justo debajo de mis narices!
Editar: agregar captura de pantalla:
Aquí está mi código para el tema del cuadro de diálogo de alerta:
<style name="alertDialog" parent="Theme.AppCompat.Dialog.Alert">
<item name="android:background">@color/light_button_text_color</item>
<item name="android:textColor">@android:color/black</item>
<item name="android:textColorPrimary">@android:color/black</item>
<item name="android:textColorSecondary">@android:color/black</item>
<item name="android:titleTextColor" tools:targetApi="m">@android:color/black</item>
</style>
Coloque este código en styles.xml. En tu Java, aplica este tema como:
AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.alertDialog);
Basándose en la respuesta de @ general03, puede usar el estilo incorporado de Android para personalizar el diálogo rápidamente. Puede encontrar los temas de diálogo en android.R.style.Theme_DeviceDefault_Dialogxxx
.
Por ejemplo:
builder = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_Dialog_MinWidth);
builder = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_Dialog_NoActionBar);
builder = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_DialogWhenLarge);
Cambié de color programáticamente de esta manera:
var builder = new AlertDialog.Builder (this);
...
...
...
var dialog = builder.Show ();
int textColorId = Resources.GetIdentifier ("alertTitle", "id", "android");
TextView textColor = dialog.FindViewById<TextView> (textColorId);
textColor?.SetTextColor (Color.DarkRed);
como alertTitle, puede cambiar otros datos de esta forma (el siguiente ejemplo es para titleDivider):
int titleDividerId = Resources.GetIdentifier ("titleDivider", "id", "android");
View titleDivider = dialog.FindViewById (titleDividerId);
titleDivider?.SetBackgroundColor (Color.Red);
esto está en C #, pero en java es lo mismo.
Necesita definir un Tema para su AlertDialog y hacer referencia a él en el tema de su Actividad. El atributo es alertDialogTheme
y no alertDialogStyle
. Me gusta esto:
<style name="Theme.YourTheme" parent="@android:style/Theme.Holo">
...
<item name="android:alertDialogTheme">@style/YourAlertDialogTheme</item>
</style>
<style name="YourAlertDialogTheme">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
<item name="android:windowTitleStyle">...</item>
<item name="android:textAppearanceMedium">...</item>
<item name="android:borderlessButtonStyle">...</item>
<item name="android:buttonBarStyle">...</item>
</style>
Podrá cambiar el aspecto del texto y el color para el título, el mensaje y tendrá cierto control sobre el fondo de cada área. Escribí una publicación de blog que detallaba los pasos para diseñar un AlertDialog.
Tienes que agregar el estilo al constructor del diálogo
builder = new AlertDialog.Builder(this, R.style.DialogStyle);
Use esto en su Estilo en sus valores-v21 / style.xml
<style name="AlertDialogCustom" parent="@android:style/Theme.Material.Dialog.NoActionBar">
<item name="android:windowBackground">@android:color/white</item>
<item name="android:windowActionBar">false</item>
<item name="android:colorAccent">@color/cbt_ui_primary_dark</item>
<item name="android:windowTitleStyle">@style/DialogWindowTitle.Sphinx</item>
<item name="android:textColorPrimary">@color/cbt_hints_color</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>
Y para los dispositivos pre lollipop ponlo en values / style.xml
<style name="AlertDialogCustom" parent="@android:style/Theme.Material.Dialog.NoActionBar">
<item name="android:windowBackground">@android:color/white</item>
<item name="android:windowActionBar">false</item>
<item name="android:colorAccent">@color/cbt_ui_primary_dark</item>
<item name="android:windowTitleStyle">@style/DialogWindowTitle.Sphinx</item>
<item name="android:textColorPrimary">@color/cbt_hints_color</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>
<style name="DialogWindowTitle.Sphinx" parent="@style/DialogWindowTitle_Holo">
<item name="android:textAppearance">@style/TextAppearance.Sphinx.DialogWindowTitle</item>
</style>
<style name="TextAppearance.Sphinx.DialogWindowTitle" parent="@android:style/TextAppearance.Holo.DialogWindowTitle">
<item name="android:textColor">@color/dark</item>
<!--<item name="android:fontFamily">sans-serif-condensed</item>-->
<item name="android:textStyle">bold</item>
</style>
Eliminar el fondo del panel
<item name="android:windowBackground">@color/transparent_color</item>
<color name="transparent_color">#00000000</color>
Este es mi estilo:
<style name="ThemeDialogCustom">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:windowBackground">@color/transparent_color</item>
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
<item name="android:colorBackgroundCacheHint">@null</item>
</style>
Que he agregado al constructor.
Agregar textColor:
<item name="android:textColor">#ff0000</item>