当前Android设备上最多有3个(有时4个)主题可用(不包括.Light
变体及类似内容)。
Theme
![Theme](https://istack.dev59.com/RUQQu.webp)
是早期版本的Android默认主题,从2.3 Gingerbread(10)开始使用。这些版本中可能有一些次要的样式更改。
Theme.Holo
![Theme.Holo](https://istack.dev59.com/mLlLv.webp)
在Android 3.0 Honeycomb(11)中引入。
Theme.Material
![Theme.Material](https://istack.dev59.com/h6pmZ.webp)
在Android 5.0 Lollipop(21)中首次出现。
Theme.DeviceDefault
(可能是任何东西)
在Android 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"
...
官方文档链接
根据平台版本选择主题 - 此官方文档介绍通过资源配置定义不同样式的方法。
Holo Everywhere - 博客文章,解释了默认机制和DeviceDefault / Holo主题。
使用材料主题 - 材料文档。
targetSdkVersion="11"
,那么它会如何影响在 2.1、2.2 和 2.3.3(API 级别 7、8 和 9/10)上运行我的应用程序的设备?我想我有点困惑于目标 API 级别和最低 API 级别之间的区别。 - Jake WilsontargetSdkVersion
表示兼容某个 API 级别。如果您的应用在更高级别的设备上运行,则启用一些兼容选项,并使设备行为像您指定的最高级别。如果设备低于您的目标级别,则它仅表现得像它本来那样。最小级别是您的应用程序需要运行的级别-下面的设备无法工作。因此,您必须确保所有最小和目标级别之间的设备都能正常工作。 - zapl.Light
主题,您可以尝试使用Theme.DeviceDefault.Light
。 - Sam