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

cod*_*123 159 xml android xml-namespaces android-layout android-tools-namespace

这是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>
Run Code Online (Sandbox Code Playgroud)

app命名空间的用途是什么?它是"标准"Android XML命名空间吗?是否有相同的值选项可用于放置在两个不同命名空间中的相同属性(例如app:showAsActionandroid:showAsAction).

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

即,如果属性是相反的,上面示例中的行是否意味着其他内容:

android:showAsAction="never"
Run Code Online (Sandbox Code Playgroud)

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

ian*_*ake 208

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

在这种情况下,appcompat-v7库使用镜像android:命名空间的自定义属性来支持以前版本的android(例如:android:showAsAction仅在API11中添加,但是app:showAsAction(作为应用程序的一部分提供)适用于您的应用程序所做的所有API级别) - 显然使用android:showAsAction它不适用于未定义该属性的API级别.

  • 它有两个部分:1)自定义属性(`app:showAsName`)及其所有可能的值*都包含在你的app*中,当你包含`appcompat-v7`库(它在`attrs中定义它)时. xml`文件).2)使用`ActionBarActivity`时自动使用的AppCompat库(特别是[ActionMenuView](https://developer.android.com/reference/android/support/v7/widget/ActionMenuView.html)解析和使用`app:showAsAction`在所有API级别上以相同的方式正确显示项目.它当然需要XML和代码一起工作. (13认同)
  • 静默忽略不存在的属性.在创建自定义属性时,您可以保证自定义属性在运行时存在(显然:它的定义包含在您的应用中).因此,支持库使用自定义属性,以便用于构建菜单的自定义代码可以使用在所有的API版本的作品,基本上是更换任何需要使用`Android的一个代码路径:`版本. (4认同)
  • 如果我不是没有得到它,我很抱歉.你能帮助我理解改变命名空间如何简单地为属性定义吗?如果旧库中不支持`showAsName`属性,那么使用自定义命名空间如何允许平台知道可能的值选项范围(`ifRoom`,`never`等),并知道如何解释那些选择?我假设"不存在的属性"是指库中没有实现的属性.交换`android:`for app:`似乎不是一个完整的解决方法.我错过了什么吗? (2认同)