Android Databinding Library中的任何重大错误或问题?

谁能使用android数据绑定库(com.android.databinding:dataBinder)评论这个testing版库? 在android开发人员网站上说:“它可能包含错误,并且可能不适用于您的用例,因此使用它需要您自担风险。”,是否有任何问题或重大错误或错误?

Solutions Collecting From Web of "Android Databinding Library中的任何重大错误或问题?"

过去几周我一直在玩数据绑定库,考虑到它是第一个版本,所以令人惊讶的是,

到目前为止我发现的唯一的错误有一个解决方法。 我会在下面解释。

在数据绑定布局文件(一个现在使用<layout>标记作为根的布局文件)中使用<include>标记时,生成的代码为<include>标记的父ViewGroup创build一个绑定。

使用DataBindingUtil对视图进行膨胀时,应用程序将在尝试parsingViewGroup时崩溃。 代码生成器和运行时绑定逻辑之间似乎有不同的行为。

问题示例

以上是上述问题的示例布局。

 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> </data> <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <!-- This include causes no issues --> <include layout="@layout/view_content"/> <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent"> <!-- This include however causes the data binding to crash on the ScrollView --> <include layout="@layout/view_content"/> </ScrollView> </RelativeLayout> </layout> 

这里是包含的布局。

 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> </data> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Test"/> </layout> 

当试图使用DataBindingUtil.setContentView时发生以下崩溃。

 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ScrollView.setTag(java.lang.Object)' on a null object reference 

解决scheme(解决方法)

我发现的临时解决方法是将一个虚拟值绑定到<include>标记的父ViewGroup。 这允许数据绑定在运行时查找ViewGroup,避免崩溃。

这里是一个修复实例的例子:

 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bind="http://schemas.android.com/apk/res-auto"> <data> <variable name="viewModel" type="com.example.ViewModel"/> </data> <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <!-- This include causes no issues --> <include layout="@layout/view_content"/> <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" bind:visibility="@{viewModel.dummyVisibility}"> <!-- This include will not cause a problem now that the ScrollView has a value being bound --> <include layout="@layout/view_content"/> </ScrollView> </RelativeLayout> </layout> 

这里是非常基本的视图模型:

 package com.example; import android.databinding.BaseObservable; import android.databinding.Bindable; import android.view.View; public class ViewModel extends BaseObservable { @Bindable public int getDummyVisibility() { // TODO: This is a work around. Currently data binding crashes on certain views if they don't have binding. return View.VISIBLE; } } 

希望这个问题在将来得到解决,这个解决方法将不是必需的!

编辑

我在https://code.google.com/p/android-developer-preview/issues/detail?id=2421上发现了另一个关于自定义绑定适配器的问&#x9898;

我发现了一个关于ObservableField的bug, 在这里提交。

根据数据绑定指南 ,模型类可能包含ObservableField属性,以保持属性定义的简短性。 指南中的示例:

 private static class User extends BaseObservable { public final ObservableField<String> firstName = new ObservableField<>(); public final ObservableField<String> lastName = new ObservableField<>(); public final ObservableInt age = new ObservableInt(); } 

通过使用这个类BR类中的名称属性不会生成,并且实现类不能被编译,因为它们引用它们。 exception:这些属性也被定义为布局XML中的variables,这在指南的示例布局中并不是这种情况:

 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.example.User"/> </data> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.lastName}"/> </LinearLayout> </layout> 

BR.user被定义; BR.firstName,BR.lastName和BR.age不是。

像这样改变用户类可以解决这个问题:

 private static class User extends BaseObservable { @Bindable public final ObservableField<String> firstName = new ObservableField<>(); @Bindable public final ObservableField<String> lastName = new ObservableField<>(); @Bindable public final ObservableInt age = new ObservableInt(); } 

在我看来,当使用Observable *types时,他们的名字应该被添加到BR.java默认情况下,@Bindable应该被废弃。

至less应该通过将@Bindable注释添加到ObservableField示例代码来解决这个问题。

花了我两天来分析和解决这个问题。

它目前不支持@style。 例如:

 style="@{viewModel.getStyle() ?? @style/default_style}" 

如果getStyle()返回null,上面将尝试设置样式资源中find的默认样式。 不幸的是,这是不可能的,但会为数据绑定imo添加一个非常强大的function。

当我在Android上使用数据绑定库实现MVVM模式时,发现了一些错误。 其中一些已经在这里提到。 虽然,我可以添加与事件有关的另一个错误。 事件不能包含参数。 这意味着数据绑定库在发送事件时没有重要的传输能力。 不过,我希望在下一个版本中它会被修复。 在此之前,请查看此问题的解决scheme: https : //code.google.com/p/android/issues/detail?id=185097