样式和主题在values、values-v11和values-v14文件夹中的区别

30

目前我正在开发我的应用程序,基于Holo主题进行设计。总体上我想做的事情是可以实现的,但是我对valuesvalues-v11values-v14这些文件夹的工作方式有些困惑。

所以我知道:

  • values 目标API小于11
  • values-v11 目标API在11到13之间
  • values-v14 目标API大于13

起初,我认为我必须为每个文件夹指定应用程序所需的所有样式,但后来我意识到一种继承系统已经存在。

我的问题是,我真的很困惑,不太清楚这三个文件夹之间的继承关系是如何工作的。

我进行了以下测试,以便查看我的手机上的行为(运行在Android 4.0上,因此应该加载values-v14文件夹):

values中,我有一个样式,设置文本颜色为蓝色:

<style name="TextMedium" parent="@android:style/TextAppearance.Medium">
    <item name="android:textColor">@color/Blue</item>
values-v11中,我有一个设置文本颜色为白色的样式:
<style name="TextMedium" parent="@android:style/TextAppearance.Medium">
    <item name="android:textColor">@color/White</item>
values-v14中,我有一个样式来将文字颜色设置为红色:

<style name="TextMedium" parent="@android:style/TextAppearance.Medium">
    <item name="android:textColor">@color/Red</item>
对于上述第一种情况(每个文件夹都有不同的颜色),我的文本加载的颜色是红色,这意味着values-v14文件夹具有优先权。
然后,如果我注释掉values-v14文件夹中的红色样式,文本就会变为白色。这是否意味着即使设备针对values-v14文件夹,系统也会采用values-v11文件夹中的样式? 我以为它可能会默认使用values文件夹,但不是values-v11
更普遍地说,我的问题是,这三个文件夹是父子关系吗? 意思是:
  • 如果设备正在运行API版本> 13,则系统将加载values-v14,然后是values-v11,最后是values
  • 如果设备在11到13之间运行API,则系统将加载values-v11,然后是values
  • 如果设备运行的API版本<11,则系统仅会加载values
如果确实是这样工作的,那么在父文件夹values中设置最大数量的样式并仅添加特定的样式到v11或v14是否有意义呢?
对不起,问题很长,希望清楚,Android指南中只简要描述了这个主题/样式系统,很难找到有关其工作方式的信息...
谢谢你的帮助!

4
values-v14 目标 API >= 14,values-v11 目标 API 在 11 至 13(包括 11 和 13)之间 如果 values-v14 存在,否则 它将匹配从 11 开始的所有版本及以上。values 是默认文件夹,它将作为最后一个被匹配,覆盖其他没有被其他 values-xx 文件夹覆盖的 API 级别。 - user
感谢Luksprog。基于这种机制,意味着最好只设置无法使用较低版本的v11和v14样式?(因此保持像我在values中发布的简单样式?) - Yoann Hercouet
2
这就是我们的想法,当使用从某个版本添加的属性时,请使用版本指示器。例如,Honeycomb为ListView引入了activatedBackgroundIndicator属性。由于此属性在11以下不存在,因此values文件夹将不使用此属性,但您可以包含一个values-v11文件夹,以利用具有该属性的版本中的应用程序。但是,如果您有不同的文件夹,则需要同时拥有其他样式。 - user
谢谢!你解答了我的疑惑,现在我清楚地知道如何正确使用它了。 - Yoann Hercouet
1
Luksprog,你应该将你的评论添加为官方答案——否则这个问题会一直显示在未回答的列表中。 - Jo Jo
@Luksprog,请将您的评论发布为答案。 - GareginSargsyan
1个回答

26
更一般地说,我的问题是,这3个文件夹是否作为父子文件夹在工作?
这些文件夹使用“最具体”匹配系统,意味着它会匹配最接近(较低的)API级别的values文件夹:
- values-v14针对API >= 14(对于版本低于14的版本将不被选中) - 如果存在values-v14,则values-v11针对API介于(包括)11和13之间,否则它将匹配从11开始的所有版本及以上版本(对于版本低于11的版本将不会被选中) - values是默认文件夹,它将是最后被匹配的,覆盖其他没有被另一个values-xx文件夹覆盖的API级别。你应该始终将此文件夹放入你的应用程序中(与所有资源文件夹一样)。
如果确实是这样工作的,那么在父文件夹values中设置最大样式并仅在v11或v14中添加特定样式是否有意义?
是的,这就是Android项目模板的构建方式(当您使用创建新项目...时),它实际上告诉您要使用values-xx文件夹进行自定义(不同的外观,使用新样式、属性)。
 <!-- in the styles.xml from the v-14 values folder: -->
 <!-- API 14 theme customizations can go here. -->

嘿,我有一个问题。假设我有一个样式,它的值完全不同,但在values-v11和values-v14中有很多共同的项目。那么,在values-v11文件夹中创建一个通用主题是个好主意吗?然后在values-v14中继承该主题并添加额外的项目? - Shivam Pokhriyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接