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

Posted

技术标签:

【中文标题】为啥这行 xmlns:android="http://schemas.android.com/apk/res/android" 必须是布局 xml 文件中的第一行?【英文标题】:Why this line xmlns:android="http://schemas.android.com/apk/res/android" must be the first in the layout xml file?为什么这行 xmlns:android="http://schemas.android.com/apk/res/android" 必须是布局 xml 文件中的第一行? 【发布时间】:2011-10-30 11:12:19 【问题描述】:

为什么xml布局文件需要这一行?

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

【问题讨论】:

不需要在第一行吗? 【参考方案1】:

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

<LinearLayout android:id>
</LinearLayout>

xml 将使用http://schemas.android.com/apk/res/android:id 来唯一标识,而不是调用android:id。通常这个页面不存在(它是一个 URI,而不是一个 URL),但有时它是一个解释使用的命名空间的 URL。

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

Here 是一个解释。

统一资源标识符 (URI)

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

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

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

【讨论】:

那为什么我们有android:layout_width 而不仅仅是layout_width 那我们怎么用“LinearLayout”而不是“android:LinearLayout”呢? 可能是因为 LinearLayout 是根命名空间的一部分,而 android:xxx 属性是子命名空间的一部分 ("schemas.android.com/apk/res/android/android/id") 当然它不会获取这个 url,它是一个 URI:w3schools.com/xml/xml_namespaces.asp 来自danielmiessler.com/study/url_vs_uri:“URL 是一种 URI。所以如果有人告诉你 URL 不是 URI,他就错了。但这并不意味着所有 URI 都是 URL。所有蝴蝶会飞,但不是所有会飞的都是蝴蝶。使 URI 成为 URL 的部分是包含“访问机制”或“网络位置”,例如 http://, ftp://, ldap:// , telnet://等【参考方案2】:

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

Sample::

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

Uniform Resource Indicator(URI)

在计算中,统一资源标识符 (URI) 是一个字符串 用于标识资源名称的字符。 这种标识可以与 网络上的资源,通常是万维网,使用特定的 协议。

例如:http://schemas.android.com/apk/res/android:id 是这里的 URI


XML Namespace:

XML 命名空间用于提供唯一命名的元素和 XML 文档中的属性。 xmlns:android 描述了安卓 命名空间。 之所以这样使用,是因为这是 google 的设计选择 在编译时处理错误。 还假设我们编写自己的textview 小部件,使用不同的 与 android textview 相比,android 命名空间有助于 区分我们自定义的textview 小部件和android textview小部件

【讨论】:

与上面没有明确解释“为什么?”的答案相比,这个答案真的值得一读 您说的是,“这样的标识可以使用特定协议通过网络(通常是万维网)与资源的表示进行交互。例如:schemas.android.com/apk/res/android:id 是这里的 URI” - 但是如果我没有互联网连接,这个 android 命名空间将如何通过网络与资源交互? Android 是否允许开发人员定义自己的架构?例如。我编写了一个自定义组件,它使用 XML 解析器获取 menu.xml 的项目并构建它自己的自定义 UI。我想用我自己的一组声明编写一个模式,即在菜单文件夹中,我想要一个模式,其中只有 id、标题、启用、图标、iconTint、可见和启用工作,IDE 不应该自动完成以显示其他我的组件不支持或不需要的项目,例如 actionLayout、menuCategory 等。如何为库定义自己的命名空间/模式?【参考方案3】:

xmlns 指的是XML namespace

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

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

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

【讨论】:

【参考方案4】:

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

开头

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

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

【讨论】:

简单明了。我不知道其他答案,但你的答案就像磁铁一样让我感到困惑,我的概念现在很清楚。【参考方案5】:

xmlns:android

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

参考https://developer.android.com/guide/topics/manifest/manifest-element#nspace

【讨论】:

【参考方案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” android 相关的标签将不会在我们布局的 xml 文档中被识别。

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:
xmlns:android="http://schemas.android.com/apk/res/android"

这是 xmlns:android ="@+/id" 的形式。现在引用它,我们使用例如

android:layout_
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"

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

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

来自&lt;manifest&gt; element documentation。

【讨论】:

【参考方案11】:
xmlns:android="http://schemas.android.com/apk/res/android" 

xmlns : 是 xml 命名空间 网址:“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_
android:layout_>

<EditText
   android:layout_
   android:layout_
   android:layout_marginBottom="4dp"
   android:hint="User Name"
  />
</LinearLayout> 

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

    在上面的 XML 文件中,我们现在已经为我们的布局定义了 layout_width,如果您在第二次定义相同的属性时会遇到错误。 EditText 在那里,但如果你想添加另一个 EditText 没问题。

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

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

【讨论】:

【参考方案12】:

以上答案中缺少以下重点,

当我们在 xml 文件的根目录中声明 xmlns:android="http://schemas.android.com/apk/res/android" 时,所有已经附加到这个命名空间的属性和标签都会被导入.

所以下次我们给 android: 时,就会出现自动完成列表。

【讨论】:

【参考方案13】:

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

【讨论】:

请详细说明

以上是关于为啥这行 xmlns:android="http://schemas.android.com/apk/res/android" 必须是布局 xml 文件中的第一行?的主要内容,如果未能解决你的问题,请参考以下文章

android button为啥会用阴影

xmlns:android="http://schemas.android.com/apk/res/android" 被添加到我的所有布局对象中导致错误

我们是不是需要将 xmlns:android="http://schemas.android.com/apk/res/android" 添加到 XML 文件的每个根视图中?

xmlns:android="http://schemas.android.com/apk/res/android" 是什么意思?

XML中的“xmlns”是啥意思?

if(TextUtils.isEmpty(sp.getString("password", ""))),这行代码报空指针异常,怎么解决?