42

我有一个要为 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 的主题。ETC...

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

4

2 回答 2

72

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

Theme

主题

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


Theme.Holo

主题.Holo

随 Android 3.0 Honeycomb 引入 (11)


Theme.Material

主题.材质

Android 5.0 Lollipop 中的新功能 (21)


Theme.DeviceDefault

(可以是任何东西)

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


最好的方法是什么?

无主题 + targetSdkVersion >= 14

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

  • 针对旧平台的应用程序Theme(即 API 级别 3-10)将仅获得Theme.
  • 针对 11-13 的应用获得Theme.Holo.
  • 14岁以上即可获得Theme.DeviceDefault

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

指定不同的主题

Android 的资源覆盖系统允许根据设备 API 级别指定样式。例如res/values-v11和中样式的不同版本res/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>

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


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

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

官方文档链接

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

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

使用材质主题- 材质文档

于 2012-03-22T23:51:40.243 回答
3

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

值/样式.xml:

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

值-v11/styles.xml:

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

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

问候史蒂芬万斯加德

于 2013-06-19T18:46:25.953 回答