如何使用设备默认主题的应用程序?
我有一个应用程序,我想为Android 2.1,2.2,2.3.3,3.0 / 3.1和4.0.x开发。 在这些API级别之间,有大约3种不同types的主题。 最新的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姜饼(10),包括在这些版本中的一些小的风格改变
Theme.Holo
用Android 3.0 Honeycomb引入(11)
Theme.Material
Android 5.0新棒棒糖(21)
Theme.DeviceDefault
(可能是任何东西)
推出4.0冰淇淋三明治(14),这是一个可以由设备制造商定制的主题。 它代表设备的本机外观,例如Nexus设备上的Holo或Material(在Android Studio的devise编辑器中),也可能是其他设备上的自定义设置。 如果“自定义”不是一个选项,这些设备必须带有股票主题。 需要股票主题的应用程序必须指定它。
什么是最好的办法呢?
没有主题+ targetSdkVersion> = 14
最简单但不一定是最好的select是根本不定义主题。 Android会为您select默认值。 但Android并不想让你的应用程序惊讶你不期望的主题,所以它回落到你可能devise你的应用程序的主题。 它通过查看AndroidManifest.xml
中的android:targetSdkVersion
(现在可以通过gradle设置)来实现。
- 面向只有
Theme
(即API级别3-10)的旧平台的应用程序将只获得Theme
。 - 以11-13为目标的应用程序将获得
Theme.Holo
。 - 14或以上将得到
Theme.DeviceDefault
。
由于这只是为了向后兼容,你不会在你的老姜饼手机上获得Theme.Material
。 因此没有主题+目标14+ =设备默认值。
指定不同的主题
Android的资源覆盖系统允许指定基于设备API级别的风格。 例如res/values-v11
和res/values-v21
不同版本的样式。 这也是通过Android Studio新build的应用程序将为您设置的。
作为一个例子,一个.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
应该足够用于默认外观,但是不允许微调devise。 不伤害添加v14覆盖。 DeviceDefault和Holo毕竟可能是不同的。
AndroidManifest.xml
是放置自定义主题的地方。 例如,作为应用程序范围默
... <application android:theme="@style/AppTheme" ...
链接到官方文档
根据平台版本select主题 – 通过资源configuration定义不同风格的官方文档
Holo Everywhere – 解释默认机制和DeviceDefault / Holo主题的博文
使用材料主题 – 材料文档
您可以在values / styles.xml中声明主题,然后在值-V11 / styles.xml中使用Holo版本覆盖它:
价值观/ styles.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 +设备上的全息主题和其他人的常规主题。
问候Steffen Vangsgaard