为啥这行 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
”。
来自<manifest>
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 文件中的第一行?的主要内容,如果未能解决你的问题,请参考以下文章
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" 是什么意思?
if(TextUtils.isEmpty(sp.getString("password", ""))),这行代码报空指针异常,怎么解决?