数据绑定库在自动生成的java类中创建错误的类型

时间:2017-07-05 17:02:09

标签: java android android-databinding 2-way-object-databinding

我有一个像这样的POJO类(我删除了不相关的字段)

public class FeedingTable {

    private String Day;

    private Integer Fasting; <-- note that this field is Integer
}

并在Layout xml:

中使用它

<data>

    <variable
        name="friday"
        type="models.FeedingTable" />
</data>

<!-- other views -->
<EditText
    android:id="@+id/fasting"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:inputType="number"
    android:text="@={friday.fasting}">
<!-- other views -->

当我编译我的项目时,我有编译时错误,我检查了它并且我弄清楚为此布局生成的java类为EditText创建了一个Short字段并且它在转换时遇到问题{{ 1}}到Short

Integer

为什么会这样?我尝试清理和重建项目,但没有成功。为什么数据绑定器创建短而不是整数?如果你看到它创建// somewhere in generated java class private android.databinding.InverseBindingListener fridayFastingandroidTextAttrChanged = new android.databinding.InverseBindingListener() { @Override public void onChange() { // Inverse of friday.fasting // is friday.setFasting((java.lang.Integer) callbackArg_0) java.lang.Short callbackArg_0 = utilities.BindingUtils.getShortText(fridayFasting); // localize variables for thread safety // friday models.FeedingTable friday = mFriday; // friday.fasting java.lang.Integer fridayFasting = null; <-- ???????!!!!!! // friday != null boolean fridayJavaLangObjectNull = false; fridayJavaLangObjectNull = (friday) != (null); if (fridayJavaLangObjectNull) { friday.setFasting(((java.lang.Integer) (callbackArg_0))); <-- in this line I have error } } }; 但从不使用它。我对数据绑定器的工作原理感到非常困惑!

1 个答案:

答案 0 :(得分:0)

您已经认识到String和Integer之间没有自动转换,并为Short添加了双向绑定。我想它是这样的:

package utilities;
public class BindingUtils {
    @InverseBindingAdapter(attribute = "android:text")
    public static Short getShortText(TextView view) {...}
}

但是没有从Short转换为Integer。数据绑定有点困惑,因为存在从short到int的强制转换,并尝试使用直接转换来解决问题。

如果您使用的是Android Studio 3.0,则可以使用InverseMethods进行转换。你可以使用这样的东西:

public class BindingUtils {
    @InverseMethod("stringToInteger")
    public static String intToString(Integer value) { ... }

    public static Integer stringToInteger(String value) { ... }
}

您可以阅读有关他们的更多信息here

在Android Studio 2.3上,您必须在InverseBindingAdapter中使用正确的类型,并且不能依赖数据绑定来进行类转换。

public class BindingUtils {
    @InverseBindingAdapter(attribute = "android:text")
    public static Integer getIntText(TextView view) {...}

    @BindingAdapter("android:text")
    public static void setIntText(TextView view, Integer value) { ... }
}