2012-09-27 13 views
33

Style i motywy Androida zawsze sprawiają, że kręci mi się w głowie. Chciałem korzystać z interfejsu Holo w różnych wersjach Androida dla mojej aplikacji. Zdecydowałem się więc wyodrębnić niezbędne zasoby, przeglądając źródło.Android XML dziedziczy po dwóch motywach rodzica?

natknąłem następujących w android-15\data\res\values\themes.xml i jestem mylić, co dokładnie jest „odziedziczone” i skąd:

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

Android API Guide mówi:

Jeśli chcesz dziedzicząc ze stylów, które sam zdefiniowałeś, nie musisz używać atrybutu . Zamiast tego po prostu przedrost nazwę stylu, który chcesz dziedziczyć na nazwę nowego stylu, oddzielony kropką.

Ale znad kod, wydaje się Theme.Holo.Light dziedziczy z Theme.Holo iz Theme.Light.

Jak to działa lub czego nie czytam poprawnie?

Odpowiedz

64

Zastanawiam się również nad tym, więc napisałem prostą aplikację testową, aby spróbować. Zasoby plik wygląda tak:

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

więc zastosować AppTheme.TestTheme do aktywności w pliku manifestu. AppTheme powoduje, że okno pełnego ekranu & nie ma paska tytułu. Theme.Light tworzy światło tła okna zamiast domyślnego zaciemnienia. Po określeniu atrybutu parent="android:Theme.Light" okno jest białe, a nie pełnoekranowe - oznacza to, że atrybut parent="..." ma pierwszeństwo przed prefiksem nazwy, a hierarchia wygląda na TestTheme <- Theme.Light (light) <- Theme (dark).

Z parent = "android: Theme.Light" usunięty, ekran jest ciemny i pełny ekran, więc hierarchia TestTheme <- AppTheme (fullscreen) <- AppBaseTheme <- Theme (dark) jest na miejscu.

Po określeniu parent="..." nie ma znaczenia, kiedy usunę prefiks. Tak więc wydaje się, że parent="..." ma zdecydowanie pierwszeństwo. AppTheme.TestTheme nie dziedziczy od obojga rodziców naraz.

Teraz, patrząc na domyślny plik themes.xml, wydaje się, że Theme.Holo.Light dziedziczy z Theme.Light, a następnie wszystkie rzeczy Holo są określane ręcznie w jego opisie. Nazwali ją Theme.Holo.Light nie dlatego, że dziedziczy po Holo, ale dlatego, że chcieli nazwy, która opisuje ją jako "lekką wersję Holo". A ponieważ chcieli być $ @ &!

Zostało to przetestowane na Gingerbread 2.3.3.

+5

To było naprawdę pomocne. Dziękuję Ci! –

+7

Dwa lata, ale nadal mi pomogło. To powinno naprawdę pójść gdzieś w oficjalnych dokumentach do stylizacji. – jenzz

+0

Ciekawe .. To nie działa dla mnie: Android Studio 2.3.3 Build # AI-+162,4069837, zbudowany na 6 czerwca 2017 JRE: 1.8.0_112-release-B06 x86_64 JVM: OpenJDK 64-bitowego serwera VM od JetBrains sro – Maciej

Powiązane problemy