【问题标题】:Namespaces in binding adapter?绑定适配器中的命名空间?
【发布时间】:2017-01-14 18:32:22
【问题描述】:

我正在尝试 android 数据绑定,我对它的功能感到非常惊讶。它确实将视图的所有 getter 和 setter 转移到一个地方(布局文件或自定义绑定适配器)。

但是,我不明白这里的命名空间有什么用?我正在阅读 George 最近在 Medium here 上发表的一篇文章,他提到:

应用程序命名空间中的任何东西都不需要参数中的任何命名空间,但对于android命名空间中的属性,您必须给出完整的属性名称,包括“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/2016From User A (7/10/2016)。这两者都需要与我在第二个示例中显示的相同的参数。我怎样才能区分它们?

我也可以提供像app:format这样的第三个参数,这样我的自定义绑定函数就可以理解了,但是命名空间可以在这里发挥重要作用吗?我可以为多个数据绑定元素提供自定义命名空间并在我的绑定适配器中相应地处理它们吗?或者正如 George 在他的文章中提到的那样,命名空间将被忽略?

在官方文档中,他们使用了bind: 命名空间,并在绑定适配器方法中提供了命名空间。我对命名空间在数据绑定中的作用有点困惑。

【问题讨论】:

    标签: android data-binding namespaces android-databinding


    【解决方案1】:

    XML 非常灵活,允许您提供任意数量的名称空间。然而,Android(还)不够灵活,无法处理两个以上的问题——android 和您的应用程序的命名空间。 Android 数据绑定不区分任何应用程序命名空间名称。例如bind:app: 无关紧要,因为它们都引用 http://schemas.android.com/apk/res-auto

    因此,您的问题的答案是“否”。命名空间并没有真正的帮助。您可以使用 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)}' />
    

    但一般来说,您必须为不同的用途使用不同的属性名称,或者按照您的建议为区分项添加一个属性。

    【讨论】:

    • 嗨,乔治!很高兴收到您的来信。我确实做到了,但是time 的东西很长,所以转换它需要BindingAdapter。通过提供自定义属性,它真正扩展了布局文件的功能。我想知道放置 BindingAdapter 方法的最佳位置是什么?在一个助手类里面?如果您有许多、多个帮助程序类或活动类,布局文件将在屏幕上显示?期待您在 Medium 上发表关于数据绑定的下一篇文章。
    • 你也可以在你的表达式中使用方法,虽然它可能会让你的表达式有点笨拙:@{@string/createdBy(user.name, TimeUtil.toDate(user.time))}。如果您有用于自定义视图的 BindingAdapter,我会将它们放在自己的类中。然而,这是不同的。分组的方法有很多,我不能说一种是对的,一种是错的。如果相同属性的 BindingAdapter 在同一个类中,则可能更容易找到正确的 BindingAdapter。
    • 感谢您的建议。多处常用的可以放在一个辅助方法中进行数据绑定,特别是在单个活动中使用的可以放在活动类中。我会同意的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多