什么是 Android XML 命名空间中的'app'?

177

这是我从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:showAsAction是用来做什么的?它是一个“标准”的Android XML命名空间吗?如果将两个不同命名空间中相同属性(例如app:showAsActionandroid:showAsAction)中的相同值选项放置在其中一个命名空间中,那么另一个命名空间中会有相同的选项吗?
根据文档android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"] 也就是说,如果属性改为:app:showAsAction,那么上面例子中的行是否表示其他东西?
android:showAsAction="never"

看起来这几乎像是某种“子类化”机制,但我似乎找不到有关Google/Android来源中app命名空间的实际文档。

2个回答

233

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

在这种情况下,appcompat-v7 库使用自定义属性来映射 android: 命名空间,以支持先前版本的安卓(例如: android:showAsAction 只添加到 API11 中,但是 app:showAsAction (作为应用程序的一部分提供)可以在您的应用程序的所有 API 级别上运行)- 显然,在未定义该属性的 API 级别上使用 android:showAsAction 是无效的。


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

-1

你可以通过这个链接获取一些解释

XML命名空间

命名空间声明 使用保留的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] 在这种情况下,没有明确命名空间前缀的元素被视为不属于任何命名空间。

属性永远不受默认命名空间的影响。没有明确命名空间前缀的属性被视为不属于任何命名空间。


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