2012-09-27 5 views
33

Gli stili e i temi Android sembrano sempre girare la testa. Volevo utilizzare l'interfaccia utente di Holo su diverse versioni di Android per la mia app. Così ho deciso di estrarre le risorse necessarie sfogliando la fonte.Tema Android Android che eredita da due temi principali?

ho trovato quanto segue in android-15\data\res\values\themes.xml e sono confuso su cosa esattamente si sta 'ereditato' e da dove:

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

Il Android API Guide dice:

Se si desidera ereditato dagli stili che hai definito tu stesso, non è necessario utilizzare l'attributo parent . Invece, basta prefiggere il nome dello stile che si desidera ereditare con il nome del nuovo stile, separato da un punto.

Ma dal codice di cui sopra, sembra che Theme.Holo.Light eredita da Theme.Holo e da Theme.Light.

Come funziona, o cosa non sto leggendo correttamente?

risposta

64

Mi sono chiesto anche questo, quindi ho scritto una semplice app di prova per provarlo. file di risorse è simile al seguente:

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

Così ho applicano AppTheme.TestTheme all'attività nel file manifesto. AppTheme rende la finestra a schermo intero & non ha una barra del titolo. Theme.Light rende la luce sullo sfondo della finestra invece del buio predefinito. Quando si specifica l'attributo parent="android:Theme.Light", la finestra è bianca e non a schermo intero: ciò significa che l'attributo parent="..." ha la precedenza sul prefisso del nome e che la gerarchia sembra essere TestTheme <- Theme.Light (light) <- Theme (dark).

Con parent = "android: Theme.Light" rimosso, lo schermo è scuro e a schermo intero, quindi la gerarchia TestTheme <- AppTheme (fullscreen) <- AppBaseTheme <- Theme (dark) è a posto.

Quando è specificato parent="...", non faccio alcuna differenza quando rimuovo o meno il prefisso. Quindi lo parent="..." sembra prendere decisamente la precedenza. AppTheme.TestTheme non eredita da entrambi i genitori contemporaneamente.

Ora, guardando il tema themes.xml predefinito, sembra che Theme.Holo.Light erediti da Theme.Light e che tutta la parte di Holo sia specificata manualmente nella sua descrizione. Quindi lo hanno chiamato Theme.Holo.Light non perché erediti da Holo, ma perché volevano un nome che lo descrivesse come "la versione leggera di Holo". E perché volevano essere $ @ &! Ing confondere.

Questo è stato testato su Gingerbread 2.3.3.

+5

Questo è stato davvero utile. Grazie! –

+7

Due anni, ma ancora mi ha aiutato. Questo dovrebbe davvero andare da qualche parte nei documenti ufficiali di styling. – jenzz

+0

interessante .. Non funziona per me: Studio Android 2.3.3 Build # AI-162,4069,837 mila, costruito su 6 giu 2017 JRE: 1.8.0_112-release-b06 x86_64 JVM: OpenJDK 64-bit di server VM di JetBrains sro – Maciej