我有一个像这样的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
}
}
};
但从不使用它。我对数据绑定器的工作原理感到非常困惑!
答案 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) { ... }
}