【问题标题】:What is the 'app' Android XML namespace?什么是“app”Android XML 命名空间?
【发布时间】: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)。

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

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

android:showAsAction="never"

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

【问题讨论】:

    标签: android xml android-layout xml-namespaces android-tools-namespace


    【解决方案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]在这种情况下,没有显式命名空间前缀的元素被认为不在任何命名空间中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2011-03-23
      • 2010-10-09
      相关资源
      最近更新 更多