Android xmlns使用简介

XML Namespace

xmlns

xmlnsXML 语言中表示 Namespace 位置的标签,被定义在元素的开始标签中时。
标准语法为:

1
<element xmlns:prefix="http://Namespace-name-URI">

其中分为两部分:

  • prefix :前缀
  • Namespace URI :所关联的 Namespace 位置

在Android xml布局文件头部的

1
xmlns:android="http://schemas.android.com/apk/res/android"

即 Android API 的 Namespace 。

xmlns:app

在引用Library的第三方View时,我们需要在XML布局文件头部添加

1
xmlns:app="http://schemas.android.com/apk/res-auto"

或者

1
xmlns:app="http://schemas.android.com/apk/res/包名"

在 ADT 17.0.0(2012.3)更新中,添加了对 Library 自定义 View 的自定义 attribute 的支持。
通过使用 http://schemas.android.com/apk/res-auto 标识 XML NameSpace,而不是以往的包名。

为什么要使用 xmlns:app

在 xml 布局文件中,我们需要标识

1
xmlns:android="http://schemas.android.com/apk/res/android"

指定我们所用到的自带 View 的 attribute。但由于 API 升级,有些新添加或者更新的 attribute 对低版本 API 无法支持或者效果不一致。如果只使用 xmlns:android,那么很显然会出现一个问题:

在低 API 设备或者定制 ROM 中,会出现呈现效果不一致的问题。

使用 xmlns:app 则能够非常方便地解决这个问题。
xmlns:app 其实并不仅限于 Library,而是针对整个 App:无论是你引用的Library中的attribute,还是你自定义的全局attribute都有效。
因此,我我们引用的 appcompat-v7 Library使用和 xmlns:android相同的自定义 attribute(例如:android:showAsAction ,添加于 API 11)。显然,使用 android:showAsAction 的话,低版本 API 设备是无法支持的,而使用 app:showAsAction 则能都支持所有 API 版本。
通过使用app:showAsAction,我们便使用到了appcompat-v7的自定义attribute,其定义在 appcompat-v7res/values/attrs.xml 中的 Line 12。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?xml version="1.0" encoding="utf-8"?>
<resources>
...
<!-- Base attributes that are available to all Item objects. -->
<declare-styleable name="MenuItem">
...
<!-- How this item should display in the Action Bar, if present. -->
<!-- 自定义 showAsAction 位置 -->
<attr name="showAsAction">
<!-- Never show this item in an action bar, show it in the overflow menu instead.
Mutually exclusive with "ifRoom" and "always". -->
<flag name="never" value="0" />
<!-- Show this item in an action bar if there is room for it as determined
by the system. Favor this option over "always" where possible.
Mutually exclusive with "never" and "always". -->
<flag name="ifRoom" value="1" />
<!-- Always show this item in an actionbar, even if it would override
the system's limits of how much stuff to put there. This may make
your action bar look bad on some screens. In most cases you should
use "ifRoom" instead. Mutually exclusive with "ifRoom" and "never". -->
<flag name="always" value="2" />
<!-- When this item is shown as an action in the action bar, show a text
label with it even if it has an icon representation. -->
<flag name="withText" value="4" />
<!-- This item's action view collapses to a normal menu
item. When expanded, the action view takes over a
larger segment of its container. -->
<flag name="collapseActionView" value="8" />
</attr>
...
</declare-styleable>
...
</resources>

这样我们就可以控制 App 在不同 API 或者 ROM 中的呈现方式都一致了。