为什么这行代码xmlns:android="http://schemas.android.com/apk/res/android"必须是布局xml文件中的第一行?

181

在xml布局文件中,为什么需要这行代码?

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

它不需要在第一行吗? - Aada
13个回答

128

在XML中,xmlns声明一个命名空间。实际上,当你这样做时:

<LinearLayout android:id>
</LinearLayout>

与其调用android:id,XML将使用http://schemas.android.com/apk/res/android:id来确保唯一性。通常此页面不存在(它是一个URI,而不是URL),但有时它是一个URL,解释所使用的命名空间。

命名空间在Java应用程序中与包名称几乎具有相同的用途。

这里有一个解释。

统一资源标识符(URI)

统一资源标识符(URI)是一串字符,用于标识Internet资源。

最常见的URI是统一资源定位符(URL),用于标识Internet域地址。另一种不太常见的URI是通用资源名称(URN)。

在我们的示例中,我们只使用URLs。


14
为什么我们要使用android:layout_width而不是仅仅使用layout_width - Shashwat
5
那么为什么我们使用"LinearLayout"而不是"android:LinearLayout"? - android developer
4
当然它无法获取这个URL,因为它是一个URI:http://www.w3schools.com/xml/xml_namespaces.asp。 - NitroG42
当我试图将名称空间Uri从“http://schemas.android.com/apk/res/android/android”更改为“http://schemas.android.com/apk/res/android/and”时,我会收到一个lint错误,指出“在标签**Layout中找到意外的命名空间前缀“android”,这意味着“android”是在命名空间中定义的前缀,所有前缀都随后跟一个属性,然后是属性的值。在任何XML文档中都是如此。ADK可能设置为识别Android布局XML文件的模式。这需要进一步挖掘以确定我的假设是真还是假。 - Sri Krishna
1
一个URL是URI的一种类型。因此,如果有人告诉你URL不是URI,那么他是错的。但这并不意味着所有的URI都是URL。所有的蝴蝶都会飞,但不是所有飞行的东西都是蝴蝶。使URI成为URL的部分是包括“访问机制”或“网络位置”,例如http:/、ftp://、ldap://、telnet://等。 - yonivav
显示剩余3条评论

46

要理解为什么xmlns:android=“http://schemas.android.com/apk/res/android”必须是布局xml文件中的第一个,我们需要通过一个例子来了解组件。

示例::

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/container" >    
</FrameLayout>

统一资源标识符(URI)

  • 在计算机中,统一资源标识符(URI)是用于标识资源名称的一串字符。
  • 这种标识使得能够使用特定协议通过网络与资源的表示进行交互,通常是万维网。

例如:http://schemas.android.com/apk/res/android:id 是此处的URI。


XML命名空间

  • XML命名空间用于在XML文档中提供具有唯一名称的元素和属性。 xmlns:android 描述了android命名空间。
  • 这样做是因为这是谷歌的设计选择,可在编译时处理错误。
  • 另外,假设我们编写了自己的具有不同功能的 textview 小部件与android的 textview 小部件相比,android 命名空间帮助区分我们的自定义 textview 小部件和android的 textview 小部件。

9
相较于之前并未清晰解释“为什么”的答案,这个回答确实很值得阅读。 - eRaisedToX
你之前说过:“这种标识使得可以使用特定的协议通过网络(通常是万维网)与资源的表示进行交互。例如:http://schemas.android.com/apk/res/android:id 就是这里的URI。”但是,如果我没有网络连接,这个Android命名空间如何与网络上的资源进行交互呢? - kavie
安卓系统是否允许开发者定义自己的模式?例如,我编写了一个使用 XML 解析器来获取 menu.xml 的项目并构建自己的自定义 UI 组件。 我想编写一个具有自己声明集的模式,即在菜单文件夹中,我希望有一个仅 id、title、enabled、icon、iconTint、visible 和 enabled 有效的模式,并且 IDE 不应自动完成显示其他项目,如 actionLayout、menuCategory 等,因为我的组件不支持或需要它们。 我该如何为库定义自己的命名空间/模式? - Saifur Rahman Mohsin

30

xmlns是指XML命名空间

在XML中使用前缀时必须定义前缀的命名空间。命名空间由元素的开始标签中的xmlns属性定义。命名空间声明具有以下语法:xmlns:prefix = "URI"。

注意:解析器不使用命名空间URI查找信息。

目的是给命名空间赋予唯一名称。然而,通常公司将命名空间用作指向包含命名空间信息的网页的指针。


9

这只是XML名称空间声明。我们使用此名称空间来指定下面列出的属性属于Android。因此,它们以 "android:" 开始。

实际上,您可以创建自己的自定义属性。为了防止两个属性被命名为相同的名称但行为不同的情况,我们添加前缀 "android:" 来表示这些是Android属性。

因此,此名称空间声明必须包含在XML文件的根视图的开放标签中。


简单明了。我不知道其他答案如何,但是你的答案像磁铁一样吸引了我的困惑,现在我的概念很清晰了。 - Stack Overflow

6
  • Xmlns代表XML命名空间。
  • 它被创建用来避免XML中的命名冲突。
  • 为了通过其他方式避免命名冲突,我们需要为每个元素提供一个前缀。
  • 为了避免在每个XML标记中重复使用前缀,我们在XML的根部使用xmlns。因此我们有标签xmlns:android=”http://schemas.android.com/apk/res/android
  • 现在这里的android仅仅是表示我们正在将名称空间“http://schemas.android.com/apk/res/android”赋予它。
  • 这个命名空间不是URL,而是URI,也称作URN(通用资源名称),通常用于URI的替代方案。
  • 由于这个命名空间的存在,android将负责识别xml文档中与android相关的元素,如android:xxxxxxx等。如果没有这个命名空间,android:xxxxxxx将无法被识别。

简单地说:

如果没有xmlns:android=”http://schemas.android.com/apk/res/android”,我们的布局的xml文档中将无法识别与android相关的标记。


6

2

我认为使用命名空间可以使内容更清晰,因为我们可以创建自己的属性。如果用户指定的属性与Android的属性相同,则可以避免命名空间冲突。


2

xmlns:android是在Android中定义android命名空间的开始标签。这是由安卓谷歌开发人员定义的标准约定。当您使用默认或自定义布局时,必须使用此命名空间。

定义了Android命名空间。此属性应始终设置为“http://schemas.android.com/apk/res/android”。

来自<manifest>元素文档


2
在XML中,元素名称由开发人员定义。这经常导致在尝试混合来自不同XML应用程序的XML文档时出现冲突。用户或XML应用程序将不知道如何处理这些差异。可以使用名称前缀轻松避免XML中的名称冲突。在XML中使用前缀时,必须为前缀定义命名空间。命名空间可以通过元素的开始标记中的xmlns属性来定义。命名空间声明具有以下语法:xmlns:prefix="URI"。

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

这是一种形式的 xmlns:android="@+/id"。现在我们可以使用如下方式来引用它:
android:layout_width="wrap_content"
android:text="Hello World!"

另一个 xmlns 是

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

这是形式为xmlns:app = "@+/id"的代码,下面是它的使用方法。
 app:layout_constraintBottom_toBottomOf="parent"
 app:layout_constraintLeft_toLeftOf="parent"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接