【问题标题】:Android XML theme inheriting from two parent themes?继承自两个父主题的 Android XML 主题?
【发布时间】:2012-09-18 20:16:54
【问题描述】:

Android 样式和主题似乎总是让我头晕目眩。我想在不同版本的 Android 上为我的应用使用 Holo UI。所以我决定通过浏览源码来提取必要的资源。

我在android-15\data\res\values\themes.xml 中遇到了以下内容,我对“继承”的确切内容以及从何处感到困惑:

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

Android API Guide 说:

如果你想继承你自己定义的样式,你 不必使用parent 属性。相反,只需为名称添加前缀 将要继承的样式命名为新样式的名称, 用句号隔开。

但从上面的代码来看,Theme.Holo.Light 似乎继承自 Theme.HoloTheme.Light

它是如何工作的,或者我没有正确阅读什么?

【问题讨论】:

    标签: android xml android-ui android-theme


    【解决方案1】:

    我也一直在想这个问题,所以我写了一个简单的测试应用程序来尝试一下。资源文件如下所示:

    <!--
        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 &lt;- Theme.Light (light) &lt;- Theme (dark)

    去掉 parent="android:Theme.Light" 后,屏幕变暗全屏,所以TestTheme &lt;- AppTheme (fullscreen) &lt;- AppBaseTheme &lt;- Theme (dark) 层次结构就位。

    当指定parent="..." 时,删除前缀与否没有区别。所以parent="..." 似乎绝对优先。 AppTheme.TestTheme 不会同时从父母双方继承。

    现在,查看默认的themes.xml,似乎Theme.Holo.Light 继承自Theme.Light,然后在其描述中手动指定了所有Holo 的东西。所以他们将其命名为 Theme.Holo.Light 不是因为它继承自 Holo,而是因为他们想要一个将其描述为“Holo 的轻量版”的名称。因为他们想让 $@&! 变得混乱。

    这是在 Gingerbread 2.3.3 上测试的。

    【讨论】:

    • 这真的很有帮助。谢谢!
    • 两岁了,但还是帮了我一把。这确实应该进入官方样式文档的某个地方。
    • 有趣.. 它对我不起作用:Android Studio 2.3.3 Build #AI-162.4069837,建于 2017 年 6 月 6 日 JRE:1.8.0_112-release-b06 x86_64 JVM:OpenJDK 64 -JetBrains sro 的Bit Server VM
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 2019-12-12
    相关资源
    最近更新 更多