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

问题描述 投票:0回答:2

我想为 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 级别没有帮助。最好的方法是什么?

android android-theme
2个回答
73
投票

目前最多有 3 个,有时 4 个主题可用于 Android 设备(

.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-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>

注意:或者在

Theme.DeviceDefault
中指定
/res/values-v14/styles.xml
应该足以获得默认外观,但不允许微调设计。添加 v14 覆盖不会有什么坏处。毕竟 DeviceDefault 和 Holo 可能是不同的。


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

...
<application
    android:theme="@style/AppTheme"
    ...

官方文档链接

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

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

使用材料主题 - 材料文档


3
投票

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

值/styles.xml:

 <style name="DialogTheme" parent="@android:style/Theme.Dialog"></style>
 

values-v11/styles.xml:

 <style name="DialogTheme" parent="@android:style/Theme.Holo.Light.Dialog.NoActionBar"></style>

这样做,您将在 API 11+ 设备上拥有 Holo 主题,在其他设备上拥有常规主题。

© www.soinside.com 2019 - 2024. All rights reserved.