Theming DialogPreferences
Estoy utilizando un tema para personalizar la apariencia de un diálogo de configuración. Las preferencias se definen en XML e inflado por un PreferenceFragment
. La forma de unir el fragmento es básicamente como se describe en la guía del desarrollador .
Funciona totalmente bien personalizando la primera pantalla a través de un tema personalizado aplicado a la actividad de alojamiento:
- El estilo no se aplica en la casilla de verificación personalizada y el botón de radio
- Estilizar texto en un DialogFragment
- ¿Cuál es la diferencia entre styles.xml y themes.xml
- Mejores prácticas de estilos de Android
- ¿Cuáles son los valores de color predeterminados para el tema de Holo en Android 4.0?
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(R.style.Theme_Preferences_Dialog); ...
Con el estilo:
<style name="Theme.Preferences.Dialog" parent="@android:style/Theme.Holo.Light.Dialog"> <item name="android:colorBackground">#fff0f0f0</item> <item name="android:background">#fff0f0f0</item> <item name="android:divider">#ffe0e0e0</item> <item name="android:textColorPrimary">#ff555555</item> <item name="android:textColorSecondary">#ff808080</item> <item name="android:textAppearanceLarge">@style/preferences_large_text</item> <item name="android:textAppearanceMedium">@style/preferences_medium_text</item> </style>
Y algunas preferencias definidas como:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="@string/pref_title" > ... <ListPreference android:enabled="false" android:key="@string/pref_change_workspace_key" android:persistent="true" android:summary="@string/pref_change_workspace_summary_singel" android:title="@string/pref_change_workspace_title" /> ... </PreferenceScreen>
El problema es que todas las preferencias que están abriendo un diálogo (como una ListPreference
), tienen un estilo diferente al resto del diálogo.
El primer nivel del fragmento de configuración parece correcto:
Pero hacer clic en uno de los elementos produce un resultado incorrecto:
- ¿Es posible heredar o extender un estilo de un atributo personalizado?
- ¿Por qué no puedo hacer referencia al atributo original del tema de android de colors.xml?
- Cómo sustituir estilos de una biblioteca que tiene su propia actividad
- Cómo diseñar el Share Action Provider en Android
- Tema SeekBar Holo utilizando la biblioteca de soporte
- ¿Cómo utilizar el tema de Holo.Light, y caer de nuevo a 'Light' en los dispositivos pre-panal?
- Actionbarsherlock - cambia el color de la línea de acción
- Estilos y temas en valores, valores-v11 y valores-v14 carpetas
y el atributo windowbackground a transparente
<item name="android:windowBackground">@android:color/transparent</item>
values => styles.xml
<resources> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:dialogTheme">@style/MyDialogStyle</item> <item name="android:alertDialogTheme">@style/MyDialogStyle</item> </style> <style name="MyDialogStyle" parent="Theme.AppCompat.Light.Dialog"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:windowBackground">@android:color/transparent</item> </style> </resources>
values-v21 => styles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:dialogTheme">@style/MyDialogStyle</item> <item name="android:alertDialogTheme">@style/MyDialogStyle</item> </style> <style name="MyDialogStyle" parent="Theme.AppCompat.Light.Dialog"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:background">#fff0f0f0</item> <item name="android:windowBackground">@android:color/transparent</item> </style>
El problema visto arriba resulta de la línea
<item name="android:background">#fff0f0f0</item>
en el estilo definido. Al parecer, esta configuración también se utiliza para el diálogo generado. Al eliminar esta línea se obtiene el resultado esperado.
Debe intentar anular la propiedad de estilo android:alertDialogTheme
(admitida a partir de la API 11
) a los diálogos de preferencias de estilo (y no sólo preferencias sino también cuadros de diálogo de alerta en general):
<style name="AppTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar"> <item name="android:alertDialogTheme">@style/Theme.MyDialog</item> </style> <style name="Theme.MyDialog" parent="@style/Theme.AppCompat.Light.Dialog"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style>