2012-09-27 81 views
33

Android風格和主題似乎總是讓我頭暈目眩。我想爲我的應用在不同版本的Android上使用Holo UI。所以我決定通過瀏覽源代碼來提取必要的資源。繼承自兩個父主題的Android XML主題?

我遇到了在android-15\data\res\values\themes.xml下,我很困惑,究竟是被「繼承」什麼,並從那裏:

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

Android API Guide說:

如果你想從您自己定義的樣式繼承, 不必使用parent屬性。相反,只需將要繼承的樣式的名稱 添加到新樣式的名稱 之間即可。

但是從上面的代碼,它似乎像Theme.Holo.LightTheme.HoloTheme.Light繼承。

這是如何工作,或者我沒有正確閱讀?

回答

64

我一直在想這個,所以我寫了一個簡單的測試應用程序來嘗試它。資源文件是這樣的:

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

所以我申請AppTheme.TestTheme到活動清單文件。 AppTheme使窗口全屏&沒有標題欄。 Theme.Light使窗口背景燈亮而不是默認的黑暗。當指定parent="android:Theme.Light"屬性時,窗口是白色的而不是全屏 - 這意味着parent="..."屬性優先於名稱前綴,並且層次似乎爲TestTheme <- Theme.Light (light) <- Theme (dark)

隨着父=「android:Theme.Light」刪除,屏幕是黑暗和全屏,所以TestTheme <- AppTheme (fullscreen) <- AppBaseTheme <- Theme (dark)層次結構就位。

當指定了parent="..."時,我刪除前綴時沒有區別。所以parent="..."似乎絕對優先。 AppTheme.TestTheme不會同時從父母那裏繼承。

現在,看看默認的themes.xml,看起來Theme.Holo.Light繼承自Theme.Light,然後所有Holo的東西都在其描述中手動指定。所以他們把它命名爲Theme.Holo.Light並不是因爲它繼承了Holo,而是因爲他們想要一個名稱來描述它爲'Holo的輕型版本'。並且因爲他們想成爲$ @ &!令人困惑。

這是在薑餅2.3.3測試。

+5

這真的很有幫助。謝謝! –

+7

兩歲,但仍然幫助我。這應該真正進入官方造型文檔的某個地方。 – jenzz

+0

有趣..它不適用於我: Android Studio 2.3.3 構建#AI-162.4069837,構建於2017年6月6日 JRE:1.8.0_112-release-b06 x86_64 JVM:OpenJDK 64位服務器VM by JetBrains sro – Maciej