Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 绑定适配器中的名称空间?_Android_Data Binding_Namespaces_Android Databinding - Fatal编程技术网

Android 绑定适配器中的名称空间?

Android 绑定适配器中的名称空间?,android,data-binding,namespaces,android-databinding,Android,Data Binding,Namespaces,Android Databinding,我正在尝试android数据绑定,我对它的功能感到非常惊讶。它实际上将视图的所有getter和setter转移到一个地方(布局文件或自定义绑定适配器) 但是,我不明白名称空间在这里的用途是什么?我在读乔治最近的一篇关于媒体的文章,他提到: 应用程序名称空间中的任何内容都不需要参数中的任何名称空间,但对于android名称空间中的属性,必须提供完整的属性名称,包括“android” 所以,如果我不给出名称空间,它就可以工作。我的自定义属性以xmlns:app=”命名http://schemas.a

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

但是,我不明白名称空间在这里的用途是什么?我在读乔治最近的一篇关于媒体的文章,他提到:

应用程序名称空间中的任何内容都不需要参数中的任何名称空间,但对于android名称空间中的属性,必须提供完整的属性名称,包括“android”

所以,如果我不给出名称空间,它就可以工作。我的自定义属性以
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)}' />