Android 绑定适配器中的名称空间?
我正在尝试android数据绑定,我对它的功能感到非常惊讶。它实际上将视图的所有getter和setter转移到一个地方(布局文件或自定义绑定适配器) 但是,我不明白名称空间在这里的用途是什么?我在读乔治最近的一篇关于媒体的文章,他提到: 应用程序名称空间中的任何内容都不需要参数中的任何名称空间,但对于android名称空间中的属性,必须提供完整的属性名称,包括“android” 所以,如果我不给出名称空间,它就可以工作。我的自定义属性以Android 绑定适配器中的名称空间?,android,data-binding,namespaces,android-databinding,Android,Data Binding,Namespaces,Android Databinding,我正在尝试android数据绑定,我对它的功能感到非常惊讶。它实际上将视图的所有getter和setter转移到一个地方(布局文件或自定义绑定适配器) 但是,我不明白名称空间在这里的用途是什么?我在读乔治最近的一篇关于媒体的文章,他提到: 应用程序名称空间中的任何内容都不需要参数中的任何名称空间,但对于android名称空间中的属性,必须提供完整的属性名称,包括“android” 所以,如果我不给出名称空间,它就可以工作。我的自定义属性以xmlns:app=”命名http://schemas.a
xmlns:app=”命名http://schemas.android.com/apk/res-auto“
。我真的不知道那是什么意思
假设我有一个文本视图,我正在这样做(例如,硬编码字符串):
这真的很好,因为我可以在这里提供参数:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:createdBy="@{user.name}"
app:createdAt="@{user.time}" />
并通过将该文本设置为与上例相同的方式,在Java中处理该代码。这为布局文件提供了易于使用和理解的代码
但是,这种观点有时会发生冲突。如果我在两个不同的地方使用此文件,使用两种不同的格式,例如用户A于2016年7月10日创建的,和用户A(2016年7月10日)创建的。这两者都需要与我在第二个示例中显示的参数相同的参数。我怎样才能区分它们
我还可以提供第三个参数,比如app:format
,这样我的自定义绑定函数就可以理解了,但是名称空间在这里能起到重要作用吗?我可以为多个数据绑定元素提供自定义名称空间,并在绑定适配器中相应地处理它们吗?或者像George在文章中提到的那样,名称空间将被忽略
在官方文档中,他们使用了bind:
namespace,在绑定适配器方法中,他们在那里提供了namespace。我对名称空间在数据绑定中的作用有点困惑。XML非常灵活,允许您提供任意数量的名称空间。然而,Android还不够灵活,无法处理两个以上的--Android
和应用程序的名称空间。Android数据绑定不区分任何应用程序名称空间名称。e、 g.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)}' />
但是一般来说,您必须为不同的用途使用不同的属性名称,或者按照您的建议为差异化添加一个属性。Hi George!很高兴收到你的来信。我确实做到了,但是时间
太长了,所以转换它需要绑定适配器
。通过提供自定义属性,它真正扩展了布局文件的功能。我想知道什么是放置BindingAdapter方法的最佳位置?在一个助手类中?如果您有许多、多个助手类或活动类,那么布局文件将出现在屏幕上?期待您的下一篇关于媒体上数据绑定的文章。您也可以在表达式中使用方法,尽管这可能会使您的表达式有点笨拙:@{@string/createdBy(user.name,TimeUtil.toDate(user.time))}
。如果您有用于自定义视图的BindingAdapter,我会将它们放在它自己的类中。然而,这是不同的。分组的方式有很多种,我不能说一种是对的,一种是错的。如果具有相同属性的BindingAdapter位于同一类中,则可能更容易找到正确的BindingAdapter。感谢您的建议。放在多个位置常用的方法可以放在一个助手中,用于数据绑定,特别是在单个活动中使用的方法可以放在活动类中。我会同意的!
<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)}' />