【问题标题】:How to use device default theme for app?如何为应用程序使用设备默认主题?
【发布时间】:2012-04-07 14:16:29
【问题描述】:

我想为 Android 2.1、2.2、2.3.3、3.0/3.1 和 4.0.x 开发一个应用。在这些 API 级别之间,大约有 3 种不同类型的主题。最新的 4.0.x 主题是 Holo。

无论如何,我希望我的应用在任何设备上都使用默认的 Android 主题。如果它在 4.0.x 设备上,我希望它使用 Holo。如果它在 2.3.3 上,我希望它使用该版本 Android 的主题。等等……

有没有简单的方法来解决这个问题?我注意到在 4.0 中,他们添加了一个您可以使用的 Theme.DeviceDefault 主题,但这对旧 API 级别没有帮助。最好的方法是什么?

【问题讨论】:

    标签: android android-theme


    【解决方案1】:

    目前有多达 3 个,有时是 4 个可用于 Android 设备的主题(.Light 变体和类似的不包括在内)

    Theme

    Android 2.3 Gingerbread(10) 之前的最早版本的默认设置,包括这些版本中的一些细微的样式更改


    Theme.Holo

    随 Android 3.0 Honeycomb (11) 引入


    Theme.Material

    Android 5.0 Lollipop 中的新功能 (21)


    Theme.DeviceDefault

    (可以是任何东西)

    在 4.0 Ice Cream Sandwich (14) 中引入,该主题可由设备制造商定制。它代表了设备的本机外观 - 即 Nexus 设备(以及 Android Studio 的设计编辑器中)上的 Holo 或 Material,可能是其他设备上的自定义外观。如果“定制的东西”不是一个选项,这些设备必须带有股票主题。需要股票主题的应用程序必须指定它。


    最好的方法是什么?

    无主题 + targetSdkVersion >= 14

    最简单但不一定是最好的选择是根本不定义主题。然后,Android 将为您选择默认值。但是 Android 不希望以您不期望的主题让您的应用程序感到惊讶,因此它会退回到您可能为您的应用程序设计的主题。它通过查看AndroidManifest.xml 中的android:targetSdkVersion 来实现(现在可以通过gradle 设置)。

    • 以旧平台为目标的应用程序只有 Theme(即 API 级别 3-10),将只能获得 Theme
    • 针对 11-13 的应用获取Theme.Holo
    • 14 岁或以上将获得Theme.DeviceDefault

    由于这只是为了向后兼容,您不会在旧 Gingerbread 手机上收到 Theme.Material。因此没有主题 + 目标 14+ = 设备默认值。

    指定不同的主题

    Android 的资源覆盖系统允许根据设备 API 级别指定样式。例如res/values-v11res/values-v21 中不同版本的样式。这也是任何通过 Android Studio 新创建的应用都会为您设置的内容。

    例如,.Light 主题应用的最基本设置如下所示:

    /res/values/styles.xml 应用于每个设备并作为基础

    <resources>
        <style name="AppTheme" parent="android:Theme.Light"/>
    </resources>
    

    /res/values-v11/styles.xml 加载到所有 API 级别为 11 及以上的设备(包括 21 及以上的设备)上。但实际使用的只是最新版本的“AppTheme”。

    <resources>
        <style name="AppTheme" parent="android:Theme.Holo.Light"/>
    </resources>
    

    /res/values-v21/styles.xml

    <resources>
        <style name="AppTheme" parent="android:Theme.Material.Light"/>
    </resources>
    

    注意:或者在/res/values-v14/styles.xml 中指定Theme.DeviceDefault 应该足以获得默认外观,但不允许微调设计。添加 v14 覆盖并没有什么坏处。 DeviceDefault 和 Holo 毕竟可能不同。


    AndroidManifest.xml 是使用自定义主题的地方。例如。作为应用程序范围的默认值:

    ...
    <application
        android:theme="@style/AppTheme"
        ...
    

    官方文档链接

    Select a theme based on platform version - 通过资源配置定义不同样式的官方文档

    Holo Everywhere - 解释默认机制和 DeviceDefault / Holo 主题的博文

    Using the Material Theme - 材料文档

    【讨论】:

    • 我需要对此进行一些试验。如果我设置 targetSdkVersion="11",这将如何影响在 2.1、2.2 和 2.3.3(API 级别 7、8 和 9/10)上运行我的应用程序的设备?我想我对目标 API 级别和最低 API 级别之间的区别有点困惑。
    • targetSdkVersion 表示兼容到某个 API 级别。如果您的应用程序在更高的 API 设备上运行,则启用一些兼容性选项并且设备的行为类似于您指定的最高级别。如果设备低于您的目标级别,那么它的行为就像它一样。最低级别是您的应用运行所需的级别 - 以下设备无法运行。因此,您必须确保 min 和 target 级别之间的所有设备都能正常工作。
    • 关于希望以平台相关的方式使用.Light 主题,您可以使用Theme.DeviceDefault.Light
    【解决方案2】:

    你可以在你的 values/styles.xml 中声明一个主题,然后在你的 values-v11/styles.xml 中用 Holo-version 覆盖它:

    值/样式.xml:

     <style name="DialogTheme" parent="@android:style/Theme.Dialog"></style>
    

    values-v11/styles.xml:

     <style name="DialogTheme" parent="@android:style/Theme.Holo.Light.Dialog.NoActionBar"></style>
    

    这样做,您将在 API 11+ 设备上拥有 Holo 主题,在其他设备上拥有常规主题。

    问候 史蒂芬·万斯加德

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 2019-03-13
      • 2010-10-04
      相关资源
      最近更新 更多