在 Android XML 布局文件中,我们可以指定多个唯一的命名空间,如下所示:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom-namespace-one="http://namespace-one"
xmlns:custom-namespace-two="http://namespace-two"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
然后,在子元素中,我们可以指定属性并在它们前面加上命名空间:
<TextView
android:id="@+id/lessens_listview_textview"
custom-namespace-one:foo="value1"
custom-namespace-one:foo="value2"/>
我理解 XML 命名空间的总体目的,即确保
foo
中的 custom-namespace-one
与 foo
中的 custom-namespace-two
区分开来。我不明白的是在编译和链接资源时如何使用这些命名空间。
例如,
custom-namespace-one:foo
指的是库A中的某个属性,custom-namespace-two:foo
指的是库B中的另一个属性。
命名空间是用来查找特定属性的吗?它看起来并不像它,因为它们总是在使用库中的属性时使用,而不是在它们的实际定义中。那么,
aapt
如何知道要使用哪个资源呢?
另外,如果命名空间是
http://schemas.android.com/apk/res-auto
会怎样?这与属性应该在当前包中定义的事实有什么关系?
它们用于定义属性。它们指定要在其中查找属性定义的文件。 http://schemas.android.com/apk/res/android 是 Android SDK 的内置定义。 “http://schemas.android.com/apk/res-auto”是您的应用程序定义的属性列表(包括您依赖的库)。您可以定义任何其他您想要的,但通常应用程序仅使用这两个。
命名空间用于限定您正在使用的属性。假设您有命名空间 A 和 B。两者都定义了属性“foo”。如果您在没有名称空间的情况下指定 foo,则不可能知道要使用什么 foo。使用命名空间可以避免这个问题。