目前有多达 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 设备上的 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.DeviceDefault
in/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 主题的博客文章
使用材质主题- 材质文档