Android XML 命名空间是否用于定位特定资源?它们在 Android aapt 中有何用途?

问题描述 投票:0回答:1

在 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
会怎样?这与属性应该在当前包中定义的事实有什么关系?

android xml android-layout aapt
1个回答
0
投票

它们用于定义属性。它们指定要在其中查找属性定义的文件。 http://schemas.android.com/apk/res/android 是 Android SDK 的内置定义。 “http://schemas.android.com/apk/res-auto”是您的应用程序定义的属性列表(包括您依赖的库)。您可以定义任何其他您想要的,但通常应用程序仅使用这两个。

命名空间用于限定您正在使用的属性。假设您有命名空间 A 和 B。两者都定义了属性“foo”。如果您在没有名称空间的情况下指定 foo,则不可能知道要使用什么 foo。使用命名空间可以避免这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.