从两个父主题继承的Android XML主题?

42

Android的样式和主题总是让我非常头疼。 我想在我的应用程序中跨不同版本的Android使用Holo UI。 因此,我决定通过浏览源代码来提取必要的资源。

我在android-15\data\res\values\themes.xml中发现了以下内容,但我不确定到底从哪里“继承”了什么:

<style name="Theme.Holo.Light" parent="Theme.Light">
    ...
    ...
</style>
Android API指南中提到:

如果您想要继承自己定义的样式,不必使用parent属性。相反,只需要在新样式的名称前加上要继承的样式的名称,用句号隔开即可。

但是从上面的代码来看,似乎Theme.Holo.LightTheme.HoloTheme.Light继承。这是如何工作的,或者我没有正确理解吗?
1个回答

75

我也一直在思考这个问题,所以我写了一个简单的测试应用程序来尝试它。资源文件看起来像这样:

<!--
    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(浅)& lt; - Theme(暗)

删除parent =“android:Theme.Light”后,屏幕为黑色和全屏,因此建立了TestTheme < - AppTheme(全屏)& lt; - AppBaseTheme & lt; - Theme(暗) 层次结构。

在指定parent =“…”时,无论我是否删除前缀都没有区别。因此,parent =“…”似乎绝对具有优先权。 AppTheme.TestTheme不能同时继承两个父母。

现在,查看默认的themes.xml,似乎Theme.Holo.Light从Theme.Light继承,然后所有Holo的东西都在其说明中手动指定。因此,他们将其命名为Theme.Holo.Light,不是因为它继承自Holo,而是因为他们想要一个描述它为“Holo的轻版本”的名称。而且,因为他们想变得$@&!ing令人困惑。

这在Gingerbread 2.3.3上进行了测试。


8
两年过去了,但仍然帮助了我。这个内容应该真正地被写进官方的样式文档中。 - jenzz
有趣的是.. 对我不起作用: Android Studio 2.3.3 Build #AI-162.4069837, 于2017年6月6日构建 JRE: 1.8.0_112-release-b06 x86_64 JVM: JetBrains s.r.o提供的OpenJDK 64位服务器VM - Maciej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接