绑定适配器中的命名空间?
Namespaces in binding adapter?
我正在尝试 android 数据绑定,我对它的功能感到非常惊讶。它确实将视图的所有 getter 和 setter 转移到一个地方(布局文件或自定义绑定适配器)。
但是,我不明白这里的命名空间有什么用?我正在阅读 George 最近在 Medium here 上发表的一篇文章,他提到:
Anything in the application namespace doesn’t need any namespace in the parameter, but for attributes in the android namespace, you must give the full attribute name including the “android.”
所以,如果我不提供名称空间,它就可以工作。我的自定义属性以 xmlns:app="http://schemas.android.com/apk/res-auto"
命名。我真的不知道那是什么意思。
假设我有一个文本视图,我正在这样做(例如硬编码字符串):
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text='@{"Created By:" + user.name + " on " + user.time}' />
真的很好,我可以在这里提供论据:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:createdBy="@{user.name}"
app:createdAt="@{user.time}" />
并通过将该文本设置为与上述示例相同来处理 Java 中的代码。这为布局文件提供了易于使用和理解的代码。
但是,这种争论有时会发生冲突。如果我在 2 个不同的地方使用 2 种不同的格式,如 Created by User A on 7/10/2016
和 From User A (7/10/2016)
。这两者都需要与我在第二个示例中展示的相同的参数。我怎样才能区分它们?
我还可以提供第三个参数,例如 app:format
,这样我的自定义绑定函数就可以理解,但是命名空间在这里可以发挥重要作用吗?我可以为多个数据绑定元素提供自定义名称空间并在我的绑定适配器中相应地处理它们吗?或者名称空间会像 George 在他的文章中提到的那样被忽略?
在官方文档中,他们使用了 bind:
命名空间,在绑定适配器方法中,他们在那里提供了命名空间。我对命名空间在数据绑定中的作用有点困惑。
XML 非常灵活,允许您提供任意数量的命名空间。然而,Android 还不够灵活,无法处理两个以上的 android
和您的应用程序的命名空间。 Android 数据绑定不区分任何应用程序命名空间名称。例如bind:
或 app:
无关紧要,因为它们都指的是 http://schemas.android.com/apk/res-auto
.
因此,您的问题的答案是 "No." 命名空间并没有真正的帮助。您 可以 使用 android 命名空间——假设没有不幸的冲突。这只会将您的灵活性从一个扩展到两个,我敢肯定您想要比这更好的东西。
这个具体示例非常适合字符串格式化表达式:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text='@{@string/createdBy(user.name, user.time)}' />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text='@{@string/fromUser(user.name, user.time)}' />
但一般来说,您必须为不同的用途使用不同的属性名称,或者按照您的建议为区分符添加一个属性。
我正在尝试 android 数据绑定,我对它的功能感到非常惊讶。它确实将视图的所有 getter 和 setter 转移到一个地方(布局文件或自定义绑定适配器)。
但是,我不明白这里的命名空间有什么用?我正在阅读 George 最近在 Medium here 上发表的一篇文章,他提到:
Anything in the application namespace doesn’t need any namespace in the parameter, but for attributes in the android namespace, you must give the full attribute name including the “android.”
所以,如果我不提供名称空间,它就可以工作。我的自定义属性以 xmlns:app="http://schemas.android.com/apk/res-auto"
命名。我真的不知道那是什么意思。
假设我有一个文本视图,我正在这样做(例如硬编码字符串):
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text='@{"Created By:" + user.name + " on " + user.time}' />
真的很好,我可以在这里提供论据:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:createdBy="@{user.name}"
app:createdAt="@{user.time}" />
并通过将该文本设置为与上述示例相同来处理 Java 中的代码。这为布局文件提供了易于使用和理解的代码。
但是,这种争论有时会发生冲突。如果我在 2 个不同的地方使用 2 种不同的格式,如 Created by User A on 7/10/2016
和 From User A (7/10/2016)
。这两者都需要与我在第二个示例中展示的相同的参数。我怎样才能区分它们?
我还可以提供第三个参数,例如 app:format
,这样我的自定义绑定函数就可以理解,但是命名空间在这里可以发挥重要作用吗?我可以为多个数据绑定元素提供自定义名称空间并在我的绑定适配器中相应地处理它们吗?或者名称空间会像 George 在他的文章中提到的那样被忽略?
在官方文档中,他们使用了 bind:
命名空间,在绑定适配器方法中,他们在那里提供了命名空间。我对命名空间在数据绑定中的作用有点困惑。
XML 非常灵活,允许您提供任意数量的命名空间。然而,Android 还不够灵活,无法处理两个以上的 android
和您的应用程序的命名空间。 Android 数据绑定不区分任何应用程序命名空间名称。例如bind:
或 app:
无关紧要,因为它们都指的是 http://schemas.android.com/apk/res-auto
.
因此,您的问题的答案是 "No." 命名空间并没有真正的帮助。您 可以 使用 android 命名空间——假设没有不幸的冲突。这只会将您的灵活性从一个扩展到两个,我敢肯定您想要比这更好的东西。
这个具体示例非常适合字符串格式化表达式:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text='@{@string/createdBy(user.name, user.time)}' />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text='@{@string/fromUser(user.name, user.time)}' />
但一般来说,您必须为不同的用途使用不同的属性名称,或者按照您的建议为区分符添加一个属性。