2012-09-27 20 views
33

Los estilos y temas de Android siempre me dan vueltas. Quería 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.Tema de Android XML que hereda de dos temas principales?

me encontré con el siguiente en android-15\data\res\values\themes.xml y estoy confundido en cuanto a qué es exactamente lo que se está 'heredado' y desde donde:

<style name="Theme.Holo.Light" parent="Theme.Light"> 
    ... 
    ... 
</style> 

El Android API Guide dice:

Si desea hereda de los estilos que haya definido usted mismo, no tiene que usar el atributo parent. En su lugar, simplemente prefija el nombre del estilo que desea heredar al nombre de su nuevo estilo, separados por un punto.

Pero en el código anterior, parece que Theme.Holo.Light hereda de Theme.Holo y desde Theme.Light.

¿Cómo funciona eso, o qué no estoy leyendo correctamente?

Respuesta

64

Me he estado preguntando sobre esto también, así que escribí una aplicación de prueba simple para probarlo. 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 se aplican AppTheme.TestTheme a la actividad en el archivo de manifiesto. AppTheme hace que la ventana de pantalla completa & no tenga una barra de título. Theme.Light hace que el fondo de la ventana se ilumine en lugar del fondo oscuro predeterminado. Cuando se especifica el atributo parent="android:Theme.Light", la ventana es blanca y no a pantalla completa; esto significa que el atributo parent="..." tiene prioridad sobre el prefijo del nombre, y la jerarquía parece ser TestTheme <- Theme.Light (light) <- Theme (dark).

Con parent = "android: Theme.Light" eliminado, la pantalla es oscura y pantalla completa, por lo que la jerarquía TestTheme <- AppTheme (fullscreen) <- AppBaseTheme <- Theme (dark) está en su lugar.

Cuando se especifica parent="...", no hace ninguna diferencia cuando elimino el prefijo o no. Así que parent="..." parece tomar definitivamente la precedencia. AppTheme.TestTheme no hereda de ambos padres a la vez.

Ahora, al mirar el themes.xml predeterminado, parece que Theme.Holo.Light hereda de Theme.Light, y luego todas las cosas de Holo se especifican 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 describiera como "la versión ligera de Holo". Y porque querían ser $ @ &! Ing confuso.

Esto se probó en Gingerbread 2.3.3.

+5

Esto fue realmente útil. ¡Gracias! –

+7

Dos años de edad, pero aún así me ayudaron. Esto realmente debería ir a algún lugar en los documentos de diseño oficial. – jenzz

+0

Interesante .. No funciona para mí: Android Studio 2.3.3 Build # AI-162.4069837, construido el 6 de junio, 2017 JRE: 1.8.0_112-release-B06 x86_64 JVM: OpenJDK servidor de 64 bits VM por JetBrains sro – Maciej

Cuestiones relacionadas