【问题标题】:What is the use of a ...-v21.xml?...-v21.xml 有什么用?
【发布时间】:2015-07-08 21:08:20
【问题描述】:

我正在为 4.0 及更高版本的 android 开发应用程序。我刚刚更新到 appcompat 22.2.0,但我在网上看到所有这些对 ...-v21 / v22.xml 的引用。它们是用来做什么的?他们有什么不同吗?提前致谢!

【问题讨论】:

  • 你是指 values-v21 吗? values-v21 包含适用于 android api 21 及更高版本的资源。
  • 示例:在 api 11 中添加了操作栏。要显示操作栏,您可以在 values-v11 中设置其他样式。
  • 例如,我在学习教程时在 values-v21 文件夹中有这个主题.xml:pastebin.com/g0GrFyQT。我不确定我是否真的需要它:S
  • 如果你使用 Theme.AppCompat 作为 AppTheme.Base 的父级,你可以把它放在 values 目录中。
  • 我刚刚删除了 -v21 版本并创建了一个“普通”style.xml:pastebin.com/5P3cGFTM。我这样做有错吗?

标签: android android-appcompat


【解决方案1】:

我在 values-v21 文件夹中有这个主题.xml

res/values-v21/ 目录包含将在运行您的应用的设备处于 API 级别 21 或更高级别时使用的资源。如果设备在旧版本的 Android 上运行,res/values-v21/ 目录将被忽略。

它们是做什么用的?他们有什么不同吗?

它们用于为不同版本的Android提供不同版本的资源。

对于 themes.xml 文件,API 级别 21+ 的设备可能具有继承自 Theme.Material 的主题。但是,旧设备上不存在该主题。如果您在res/values/ 中有一个主题试图引用Theme.Material,您的应用程序将在这些旧设备上崩溃。因此,您可以在 res/values/ 中放置一个主题,该主题将适用于您支持的所有设备(例如,Theme.Holo 表示 minSdkVersion 为 11 或更高),然后覆盖该主题在res/values-v21/ 中改为使用Theme.Material

您可以在this sample app 中看到,其中Theme.Apptheme(我的应用程序的主题)继承自res/values/ 中的Theme.Holo,并继承自res/values-v21/ 中的Theme.Material。运行时使用的Theme.Apptheme 版本取决于设备的Android 版本。

【讨论】:

  • 这个解释很有道理,谢谢。在我的应用程序中,我引用了以“Theme.AppCompat.Light”为父项的样式,这是否意味着 appcompact 将负责所有这些向后兼容性,因此我无需在 values-v21 文件夹中创建 xml ?
  • @Jdruwe: Theme.AppCompat 及其子项(例如,Theme.AppCompat.Light)返回 API 级别 7,appcompat-v7 处理与该主题相关的所有向后兼容性工作。
  • @Jdruwe 不,你不需要。您可以在 values 文件夹中创建 xml(不在 values-v21 中)
  • @ShirishHerwade:文件名无关紧要。样式资源的名称很重要。如果您在values/values-21/ 中定义了相同的样式资源名称(其他任何地方都没有),API Level 21+ 设备使用values-21/ 中定义的资源,而运行旧版本Android 的设备使用@ 中定义的资源987654345@.
  • @RushiMThakker:示例使用ListActivity。如果整个活动是ListView,则不需要setContentView()ListActivity。 “如果我们有 minSDKVersion 21,我们需要 v21 文件夹吗?” -- 没有。
猜你喜欢
  • 2015-04-12
  • 1970-01-01
  • 2017-08-22
  • 2012-08-13
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多