Tema XML de Android que hereda de dos temas principales?
Los estilos y temas de Android siempre parecen hacer girar mi cabeza. Quise usar la interfaz de usuario de Holo en diferentes versiones de Android para mi aplicación. Así que decidí extraer los recursos necesarios navegando por la fuente.
Me encontré con lo siguiente en android-15\data\res\values\themes.xml
y estoy confundido en cuanto a lo que exactamente se está "heredado" y desde dónde:
- Tooltip de la imagen de Android
- Android ImageButton no muestra la imagen, aunque es visible en la vista previa de Designer
- ¿Hay una manera de mostrar los números primero en el teclado virtual para Android?
- Dibujo de lienzo que no se dibuja correctamente a pesar de las propiedades de configuración
- Coloque los botones en la parte inferior de la pantalla con LinearLayout?
<style name="Theme.Holo.Light" parent="Theme.Light"> ... ... </style>
La guía de la API de Android dice:
Si desea heredar de los estilos que ha definido usted mismo, no tiene que utilizar el atributo
parent
. En su lugar, sólo prefija el nombre del estilo que desea heredar al nombre de su nuevo estilo, separados por un punto.
Pero desde el código de arriba, parece que Theme.Holo.Light
está heredando de Theme.Holo
y de Theme.Light
.
¿Cómo funciona eso, o qué no estoy leyendo correctamente?
- RadioGroup checkedButton propiedad
- Android.view.InflateException: Archivo XML binario línea # 10: Error al inflar fragmento de clase
- "OnClick" en AutocompleteTextView provoca un error
- ¿Por qué mis elementos de ListView no se pueden hacer clic?
- Cómo arreglar este código todas las pantallas de Android
- ¿Cómo puedo editar las dimensiones de un elemento de menú PopUp en Android?
- Vista de niño androide sin estado de prensa
- Cómo inflar Android View en la clase LinearLayout?
Me he estado preguntando sobre esto también, así que escribí una aplicación de prueba simple para probarlo. El archivo de recursos se ve así:
<!-- Base application theme, dependent on API level. This theme is replaced by AppBaseTheme from res/values-vXX/styles.xml on newer devices. --> <style name="AppBaseTheme" parent="android:Theme"> <!-- Theme customizations available in newer API levels can go in res/values-vXX/styles.xml, while customizations related to backward-compatibility can go here. --> </style> <!-- Application theme. --> <style name="AppTheme" parent="AppBaseTheme"> <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">true</item> <item name="android:windowContentOverlay">@null</item> </style> <style name="AppTheme.TestTheme" parent="android:Theme.Light"> </style>
Así que aplico AppTheme.TestTheme a la actividad en el archivo de manifiesto. AppTheme hace que la ventana a pantalla completa y no tenga una barra de título. Theme.Light hace que la luz de fondo de la ventana en lugar de la oscuridad predeterminada. Cuando se especifica el atributo parent="android:Theme.Light"
, la ventana es blanca y no fullscreen – esto significa que el atributo parent="..."
tiene prioridad sobre el prefijo de nombre y la jerarquía parece ser TestTheme <- Theme.Light (light) <- Theme (dark)
.
Con parent = "android: Theme.Light" eliminado, la pantalla es oscura y la pantalla completa, por lo que la TestTheme <- AppTheme (fullscreen) <- AppBaseTheme <- Theme (dark)
está en su lugar.
Cuando parent="..."
se especifica, no hace diferencia cuando elimino el prefijo o no. Así que parent="..."
parece tener una prioridad absoluta. AppTheme.TestTheme no hereda de ambos padres a la vez.
Ahora, mirando el theme.xml por defecto, parece que Theme.Holo.Light hereda de Theme.Light, y entonces todo el material de Holo se especifica manualmente en su descripción. Así que lo llamaron Theme.Holo.Light no porque hereda de Holo, sino porque querían un nombre que lo describe como "la versión light de Holo". Y porque querían ser confusos.
Esto fue probado en Gingerbread 2.3.3.
- ¿Cómo puedo saber si existen extras de Intent en Android?
- ¿Cómo obtener el número de móvil de la tarjeta SIM actual en el dispositivo real?