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

下面是我从 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)中的同一属性,是否有相同的值选项可用。

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

也就是说,如果属性是:

android:showAsAction="never"

它看起来像是某种“子类化”机制,但是我似乎找不到任何来自 Google/Android 源的关于 app名称空间的真正文档。

88817 次浏览

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

在这种情况下,appcompat-v7库使用反映 android:名称空间的自定义属性来支持以前版本的 android (例如: android:showAsAction只在 API11中添加,但是 app:showAsAction(作为应用程序的一部分提供)可以在应用程序的所有 API 级别上工作)——显然,在没有定义该属性的 API 级别上,使用 android:showAsAction不会起作用。

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

XML 名称空间

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

例如,下面的声明将“ XHTML:”前缀映射到 XHTML 名称空间:

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

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

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

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

在这种情况下,如果没有名称空间前缀的任何元素或其祖先具有上述默认名称空间声明,则该元素被认为位于 XHTML 名称空间中。

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

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