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

Jak*_*son 41 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级别没有帮助.对此最好的方法是什么?

zap*_*apl 69

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

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.

由于这只是为了向后兼容,因此您不会Theme.Material使用旧的Gingerbread手机.因此,没有主题+目标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>
Run Code Online (Sandbox Code Playgroud)

/res/values-v11/styles.xml已加载到API等级11及以上(包括21及以上版本)的所有设备上.但实际上只使用了最新版本的"AppTheme".

<resources>
    <style name="AppTheme" parent="android:Theme.Holo.Light"/>
</resources>
Run Code Online (Sandbox Code Playgroud)

/res/values-v21/styles.xml

<resources>
    <style name="AppTheme" parent="android:Theme.Material.Light"/>
</resources>
Run Code Online (Sandbox Code Playgroud)

注意:或者指定Theme.DeviceDefaultin /res/values-v14/styles.xml应该足以具有默认外观但不允许微调设计.添加v14覆盖没有伤害.毕竟,DeviceDefault和Holo可能会有所不同.


AndroidManifest.xml是自定义主题使用的地方.例如,作为应用程序范围默

...
<application
    android:theme="@style/AppTheme"
    ...
Run Code Online (Sandbox Code Playgroud)

官方文档的链接

根据平台版本选择主题 - 通过资源配置定义不同样式的官方文档

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

使用材料主题 - 材料文档