我想为 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 级别没有帮助。最好的方法是什么?
目前最多有 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冰淇淋三明治(14)一起推出,该主题可由设备制造商定制。它代表设备的本机外观 - 即 Nexus 设备上的 Holo 或 Material(以及 Android Studio 的设计编辑器中),也许是其他设备上的自定义外观。如果无法选择“自定义内容”,则这些设备必须附带库存主题。不过,想要股票主题的应用程序必须指定它。
最好的方法是什么?
最简单但不一定是最好的选择是根本不定义主题。 Android 将为您选择默认值。但 Android 不想让您的应用程序使用您不期望的主题,因此它会退回到您可能设计应用程序的主题。它通过查看
android:targetSdkVersion
中的 AndroidManifest.xml
来实现这一点(现在可以通过 gradle 设置)。
Theme
(即 API 级别 3-10)的旧平台的应用程序将仅获得 Theme
。Theme.Holo
。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>
注意:或者在
Theme.DeviceDefault
中指定 /res/values-v14/styles.xml
应该足以获得默认外观,但不允许微调设计。添加 v14 覆盖不会有什么坏处。毕竟 DeviceDefault 和 Holo 可能是不同的。
AndroidManifest.xml
是使用自定义主题的地方。例如。作为应用程序范围的默认值:
...
<application
android:theme="@style/AppTheme"
...
根据平台版本选择主题 - 通过资源配置定义不同样式的官方文档
Holo Everywhere - 解释默认机制和 DeviceDefault / Holo 主题的博客文章
使用材料主题 - 材料文档
您可以在您的values/styles.xml中声明一个主题,然后在您的values-v11/styles.xml中用Holo版本覆盖它:
值/styles.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 主题,在其他设备上拥有常规主题。