什么是“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:showAsAction
和 android: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 属性使用 那么在框架中不存在属性的旧设备上会发生什么?我还不清楚定义自定义命名空间如何解决缺少对属性的支持。在自定义命名空间下声明showAsAction
是否意味着它在新平台上按预期工作而在旧平台上被忽略?
不存在的属性会被忽略。当您创建自定义属性时,您保证自定义属性将在运行时存在(显然:它的定义包含在您的应用程序中)。因此,支持库使用自定义属性,因此他们用于构建菜单的自定义代码可以使用适用于所有 API 版本的单一代码路径,基本上取代了使用 android:
版本的任何需要。
很抱歉,如果我不明白的话。您能帮我理解更改命名空间如何简单地为属性提供定义吗?如果旧库不支持 showAsName
属性,那么使用自定义命名空间如何让平台知道可能的值选项的范围(ifRoom
、never
等),并知道如何解释这些选项?我假设“不存在的属性”是指库中没有实现的属性。将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 命名空间前缀