转发自:https://www.jianshu.com/p/6fcaffaeffd2
作为一名 Android 开发,我想大家对xmlns
并不会陌生,因为在写布局文件(如下代码所示)的时候经常会碰到,虽然很多人对其含义并不是特别了解(比如说我)。好吧,今天我们就来挖一挖这神奇的xmlns
。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/window_background">
</LinearLayout>
什么是xmlns
首先,我们先来看下到底什么是xmlns
,它是 XML 文档中的一个概念:英文叫做 XML namespace,中文翻译为 XML 命名空间。一讲到命名空间,我想很多人会联想到C++
中的namespace
和Java
中的 packagename,而这两者的作用都是为了解决命名上的冲突(例如类名,接口名等)。类似的,XML namespace
也是为了解决 XML 中元素和属性命名冲突,因为 XML 中的标签并不是预定义的,这一点与 HTML 是有区别的,HTML 中的标签是预定义的,所以我们会遇到命名冲突的问题。
XML 命名空间定义语法为xmlns:namespace-prefix="namespaceURI"
,一共分为三个部分:
xmlns
:声明命名空间的保留字,其实就是XML中元素的一个属性;namespace-prefix
:命名空间的前缀,这个前缀与某个命名空间相关联;namespaceURI
:命名空间的唯一标识符,一般就是一个URI引用。
通过上面的内容的讲解,我们对命名空间有了一定的了解,下面我们通过一个例子引用来说明一下xmlns
属性是如何解决命名冲突的:
<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
<table>
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table xmlns:f="http://www.w3school.com.cn/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
关于xmlns
就先简单讲到这里,大家如果要深入了解的话,可以点击本文中的跳转链接,下一节我们来看下 Android 中的那些xmlns。
Android中的xmlns
在Android中,目前我们碰到的xmlns
一共有三种:
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android
命名空间android
用于 Android 系统定义的一些属性。
app
命名空间app
用于我们应用自定义的一些属性,这个与 Android 自定义属性和系统控件扩展应该有关系,大家可以再继续研究一下。
tools
根据官方定义,tools
命名空间用于在 XML 文档记录一些,当应用打包的时候,会把这部分信息给过滤掉,不会增加应用的 size,说直白点,这些属性是为IDE提供相关信息。
参考文章
Tools Attributes
What does “xmlns” in XML mean
What is the 'app' Android XML namespace