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:

 <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?

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 agregar TableRow de xml a TableLayout mediante programación?
  • Se muestra Google Maps Android sólo pantalla en blanco
  • Disposición de Android: vistas cuadráticas
  • Mostrar contenido en la barra de herramientas
  • ¿Hay alguna implementación de StAX para Android?
  • Utilizar JAXB (xjc) clases generadas en android
  • ¿Cómo agregar un grupo de radio a los botones de radio dentro de una tabla?
  • ¿Puedo obtener una vista previa de la barra de acciones en el editor de diseño gráfico?
  • La barra de herramientas no se oculta mientras se desplaza
  • Eliminar icono / logotipo de la barra de acción de android
  • InvocationTargetException sobre inflar un xml - android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.