如何使用设备默认主题的应用程序?

我有一个应用程序,我想为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

Theme.Holo

用Android 3.0 Honeycomb引入(11)


Theme.Material

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-v11res/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