什么是“应用” Android XML名称空间?


164

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

<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)中的同一属性。

文档android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

即,如果属性改为,则上面示例中的行会表示其他含义:

android:showAsAction="never"

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

Answers:


213

app命名空间是不特定的库,但它是用于在你的应用程序中定义的所有属性,无论是你的代码或库导入,有效地使属性自定义一个全局命名空间-也就是说,属性不是由Android系统定义。

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


1
谢谢!我很高兴终于在文档中找到对此的提及。不过,还有一个后续问题。链接中的操作栏文档说:“请注意,上面的showAsAction属性使用在<menu>标记中定义的自定义名称空间。当使用支持库定义的任何XML属性时,这是必需的,因为这些属性在支持库中不存在。旧设备上的Android框架。因此,您必须使用自己的名称空间作为支持库定义的所有属性的前缀。”
coder123 2014年

1
那么,在框架中不存在属性的旧设备上会发生什么呢?对我而言,尚不清楚如何定义自定义名称空间如何解决对属性的缺少支持。showAsAction在自定义名称空间下声明是否意味着它在新平台上可以正常工作,而在旧平台上被忽略?
coder123

4
不存在的属性将被静默忽略。创建自定义属性时,您保证该自定义属性将在运行时存在(显然:其定义包含在您的应用中)。因此,支持库使用自定义属性,以便其用于构建菜单的自定义代码可以使用适用于所有API版本的单个代码路径,从而基本上替代了使用这些android:版本的任何需求。
ianhanniballake

2
很抱歉,如果我不明白这一点。您能帮助我了解如何简单地更改名称空间为属性提供定义吗?如果showAsName属性不是一个旧库的支持,如何使用自定义命名空间允许的平台了解可能的值选项(范围ifRoomnever等等),并知道如何解释这些选项?我假设“不存在的属性”是指库中不存在任何实现的属性。交换android:app:似乎很难像一个完整的解决方法。我想念什么吗?
coder123 2014年

14
它包括两部分:1)当您包含库(在文件中定义它)时,自定义属性(app:showAsName)及其所有可能的值都包含在您的应用中。2)AppCompat库(特别是ActionMenuView,当您使用时会自动使用它)解析并使用来以相同的方式在所有API级别上正确显示项目。当然,确实需要XML和代码协同工作。appcompat-v7attrs.xmlActionBarActivityapp:showAsAction
ianhanniballake 2014年

0

您可以从此链接获得一些解释

XML名称空间

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

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

xmlns:xhtml =“ http://www.w3.org/1999/xhtml”

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

也可以声明默认名称空间。例如:

xmlns =“ http://www.w3.org/1999/xhtml”

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.