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


Answers:


118

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

<LinearLayout android:id>
</LinearLayout>

android:idxml不会使用,而是使用http://schemas.android.com/apk/res/android:id来唯一。通常,此页面不存在(它是URI,而不是URL),但有时它是解释所用命名空间的URL。

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

是一个解释。

统一资源标识符(URI)

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

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

在我们的示例中,我们将仅使用URL。


13
那为什么我们android:layout_width不仅仅拥有layout_width呢?
Shashwat 2013年

4
那我们怎么用“ LinearLayout”代替“ android:LinearLayout”呢?
android开发人员

可能是因为的LinearLayout是根名称空间的一部分,并且机器人:XXX属性是一个子名字空间的一部分(“ schemas.android.com/apk/res/android/android/id”
NitroG42

4
当然,它不会获取此URL,而是一个URI:w3schools.com/xml/xml_namespaces.asp
NitroG42 2013年

1
来自danielmiessler.com/study/url_vs_uri:“ URL是URI的一种类型。因此,如果有人告诉您URL不是URI,那他是错的。但这并不意味着所有URI都是URL。所有蝴蝶都飞了,但是并非所有飞来飞去的东西都是蝴蝶。使URI成为URL的部分是包含“访问机制”或“网络位置”,例如http:/,ftp://,ldap://,telnet:/ /等
yonivav

37

要了解为什么xmlns:android=“http://schemas.android.com/apk/res/android”必须是布局xml文件中的第一个,我们将使用一个示例来了解组件

Sample::

<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名称空间。
  • 它之所以这样使用,是因为这是Google的一种设计选择,可以在编译时处理错误。
  • 还要假设我们编写textview与Android相比具有不同功能的自己的小部件textview,Android名称空间有助于区分自定义textview小部件和android textview小部件

8
与上述答案相比,该答案确实值得一读。
eRaisedToX

您就像在说,“这种识别可以使用特定协议通过网络(通常是万维网)与资源表示进行交互。例如:schemas.android.com/apk/res/androidid是此处的URI”-但是,如果我没有互联网连接,这个android名称空间将如何通过网络与资源交互?
kavie

29

xmlns指的是XML名称空间

在XML中使用前缀时,必须定义前缀的所谓名称空间。名称空间由元素的开始标记中的xmlns属性定义。名称空间声明具有以下语法。xmlns:prefix =“ URI”。

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

目的是给命名空间一个唯一的名称。但是,公司经常使用名称空间作为指向包含名称空间信息的网页的指针。


7

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

您实际上可以创建自己的自定义属性。因此,为了防止在两个属性被命名为相同事物但行为不同的情况下发生名称冲突,我们添加前缀“ android: ”表示这些属性是Android属性。

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


简单明了。我不知道其他答案,但是您的答案就像吸引我的困惑一样,我的想法现在很清楚。
堆栈溢出


3
  • 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:xxxxxxx等相关的android相关元素。如果没有此命名空间,将无法识别android:xxxxxxx。

用外行的话来说:

没有xmlns:android =” http://schemas.android.com/apk/res/android ” android相关标签将不会在我们布局的xml文档中识别。


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"

2

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



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

xmlns:是xml名称空间,URL:http://schemas.android.com/apk/res/android ”不过是

XSD是[XML模式定义]:用于定义XML文件的规则。

范例:

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" 
android:layout_width="match_parent"
android:layout_height="match_parent">

<EditText
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_marginBottom="4dp"
   android:hint="User Name"
  />
</LinearLayout> 

让我解释一下什么样的规则?

  1. 如果您在第二次定义错误时定义了相同的属性,则在上面的XML文件中,现在已经为布局定义了layout_width。
  2. 那里有EditText,但是如果要添加另一个EditText没问题。

此类规则在XML XSD中定义:“ http://schemas.android.com/apk/res/android

有点晚了,但我希望这对你有帮助。


0

这是一个XML名称空间声明,用于指定要减速的视图组中的属性是否与android相关。


请进一步详细说明
Pramod S. Nikam '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.