目前有多达 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-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>
注意:或者在/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 - 材料文档