如何使用app的设备默认主题?

时间:2012-03-22 23:33:58

标签: android android-theme

我有一个应用程序,我想为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级别没有帮助。最好的办法是什么?

2 个答案:

答案 0 :(得分:67)

Android设备目前最多有3个,有时4个主题可用(.Light个变体和类似的不包括在内)

Theme

  

Theme

Android最早版本的默认值为2.3 Gingerbread(10),包括这些版本中的一些小样式更改


Theme.Holo

  

Theme.Holo

与Android 3.0 Honeycomb(11)一起推出


Theme.Material

  

Theme.Material

Android 5.0 Lollipop中的新功能(21)


Theme.DeviceDefault

  

(可能是任何事情)

4.0冰淇淋三明治(14)推出,主题可由设备制造商定制。它代表设备的原生外观 - 即Nexus设备上的Holo或Material(在Android Studio的设计编辑器中),也许是其他设备上的自定义内容。如果“自定义”不是一个选项,那些设备必须附带股票主题。想要股票主题的应用程序必须指定它。


  

最好的办法是什么?

没有主题+ targetSdkVersion> = 14

最简单但不一定是最佳选择是根本不定义主题。 Android将为您选择默认值。但Android不希望使用您不期望的主题来为您的应用程序带来惊喜,因此它会回归到您可能为您的应用程序设计的主题。它是通过查看android:targetSdkVersion中的AndroidManifest.xml来实现的(现在可以通过gradle设置)。

  • 目标只有Theme(即API级别3-10)的旧平台的应用只会获得Theme
  • 定位11-13的应用获得Theme.Holo
  • 14或以上将获得Theme.DeviceDefault

由于这只是为了向后兼容,因此您不会在旧的Gingerbread手机上获得Theme.Material。因此,没有主题+目标14+ =设备默认值。

指定不同的主题

Android的资源叠加系统允许根据设备API级别指定样式。例如,res/values-v11res/values-v21中的样式的不同版本。这也是通过Android Studio为您设置的任何新创建的应用程序。

例如,.Light主题应用的最基本设置如下所示:

/res/values/styles.xml适用于每个设备并充当基础

<resources>
    <style name="AppTheme" parent="android:Theme.Light"/>
</resources>

所有API级别为11及以上的设备(包括21及以上版本的设备)都会加载

/res/values-v11/styles.xml。但实际上只使用了最新版本的“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"
    ...

官方文档的链接

Select a theme based on platform version - 通过资源配置定义不同样式的官方文档

Holo Everywhere - 解释默认机制和DeviceDefault / Holo主题的博客文章

Using the Material Theme - 材料文档

答案 1 :(得分:3)

您可以在values / styles.xml中声明主题,然后在您的values-v11 / styles.xml中使用Holo-version覆盖它:

值/ 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+设备上拥有Holo主题,在其他设备上拥有常规主题。

此致 Steffen Vangsgaard