什么是“app”Android XML 命名空间?

Posted

技术标签:

【中文标题】什么是“app”Android XML 命名空间?【英文标题】:What is the 'app' Android XML namespace? 【发布时间】:2014-12-28 19:26:36 【问题描述】:

这是我从res/menu/main.xml 文件中看到的app 命名空间示例

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity" >
<item android:id="@+id/action_settings"
    android:title="@string/action_settings"
    android:orderInCategory="100"
    app:showAsAction="never" />
</menu>

app 命名空间有什么用途?它是“标准”Android XML 命名空间吗?相同的值选项是否可用于放置在两个不同命名空间中的同一属性(例如 app:showAsActionandroid:showAsAction)。

来自docs: android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

也就是说,如果属性是,上面示例中的行是否意味着其他内容:

android:showAsAction="never"

看起来它可能是某种“子类化”机制,但我似乎无法从 Google/Android 来源中找到关于 app 命名空间的任何真实文档。

【问题讨论】:

【参考方案1】:

app 命名空间不是特定于库,而是用于应用程序中定义的所有属性,无论是由您的代码还是由您导入的库,有效地为自定义属性创建单个全局命名空间 - 即属性不是android系统定义的。

在这种情况下,appcompat-v7 库使用镜像 android: 命名空间的自定义属性来支持早期版本的 android(例如:android:showAsAction 仅在 API11 中添加,但 app:showAsAction(作为一部分提供)您的应用程序的)适用于您的应用程序的所有 API 级别) - 显然使用 android:showAsAction 不会在未定义该属性的 API 级别上工作。

【讨论】:

谢谢!我很高兴终于在文档中找到了这一点。不过,还有一个后续问题。链接中的操作栏文档说:“请注意,上面的 showAsAction 属性使用 标记中定义的自定义命名空间。使用支持库定义的任何 XML 属性时,这是必需的,因为这些属性不存在于旧设备上的 Android 框架。因此,您必须使用自己的命名空间作为支持库定义的所有属性的前缀。" 那么在框架中不存在属性的旧设备上会发生什么?我还不清楚定义自定义命名空间如何解决缺少对属性的支持。在自定义命名空间下声明 showAsAction 是否意味着它在新平台上按预期工作而在旧平台上被忽略? 不存在的属性会被忽略。当您创建自定义属性时,您保证自定义属性将在运行时存在(显然:它的定义包含在您的应用程序中)。因此,支持库使用自定义属性,因此他们用于构建菜单的自定义代码可以使用适用于所有 API 版本的单一代码路径,基本上取代了使用 android: 版本的任何需要。 很抱歉,如果我不明白的话。您能帮我理解更改命名空间如何简单地为属性提供定义吗?如果旧库不支持 showAsName 属性,那么使用自定义命名空间如何让平台知道可能的值选项的范围(ifRoomnever 等),并知道如何解释这些选项?我假设“不存在的属性”是指库中没有实现的属性。将android: 替换为app: 似乎不是一个完整的解决方法。我错过了什么吗? 包含两个部分:1) 自定义属性 (app:showAsName) 及其所有可能的值包含在您的应用程序中,当您包含 appcompat-v7 库时(在其attrs.xml 文件中对其进行了定义)。 2) AppCompat 库(特别是ActionMenuView,当您使用ActionBarActivity 时会自动使用它)解析并使用app:showAsAction 在所有API 级别上以相同的方式正确显示项目。它确实需要 XML 和代码一起工作。【参考方案2】:

你可以从这个链接得到一些解释

XML namespace

命名空间声明 使用保留的 XML 属性 xmlns 或 xmlns:prefix 声明 XML 命名空间,其值必须是有效的命名空间名称。

例如,以下声明将“xhtml:”前缀映射到 XHTML 命名空间:

xmlns:xhtml="http://www.w3.org/1999/xhtml"

任何名称以前缀“xhtml:”开头的元素或属性都被认为在 XHTML 命名空间中,如果它或祖先具有上述命名空间声明。

也可以声明一个默认命名空间。例如:

xmlns="http://www.w3.org/1999/xhtml"

在这种情况下,任何没有命名空间前缀的元素都被认为是在 XHTML 命名空间中,如果它或祖先具有上述默认命名空间声明。

如果范围内没有默认命名空间声明,则命名空间名称没有值。[6]在这种情况下,没有显式命名空间前缀的元素被认为不在任何命名空间中。

属性永远不受默认命名空间的约束。没有显式命名空间前缀的属性被认为不在任何命名空间中。

【讨论】:

以上是关于什么是“app”Android XML 命名空间?的主要内容,如果未能解决你的问题,请参考以下文章

接收解析 XML:未绑定前缀错误和属性缺少 Android 命名空间前缀

android xmlns是啥意思

布局 xml 文档中的 Android“工具”命名空间

Android 清单文件

xml 中的 Android 谷歌地图片段。我得到“意外的命名空间前缀”

XML 命名空间有啥用?