使用Integer类型的Android双向绑定导致数据绑定不存在

ank*_*ank 28 android android-databinding

我在使用Integer数据类型实现双向绑定时遇到了一些问题.

public class User {

    private String firstName;
    private String lastName;
    private int age;

    public User() {}

    public void setFirstName(String firstName) {
       this.firstName = firstName;
    }

    public String getFirstName() {
       return this.firstName;
    }

    public void setLastName(String lastName) {
       this.lastName = lastName;
    }

    public String getLastName() {
       return this.lastName;
    }

    public void setAge(int age) {
       this.age = age;
    }

    public int getAge() {
       return this.age;
    }

}
Run Code Online (Sandbox Code Playgroud)

XML:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data class="UserDataBinding">
        <variable
            name="user"
            type="com.databinding.model.User" />
    </data>

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="@dimen/activity_horizontal_margin">

       <EditText android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@={user.firstName}" />

       <EditText android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@={user.lastName}" />

       <EditText android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@={user.age}" />

    </LinearLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

不幸的是,它给了我错误

"错误:(52,17)无法在android.support.design.widget.TextInputEditText上找到属性为'android:text'的getter,其值类型为java.lang.Integer."

如果我将属性文本更改为

       <EditText android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@={Integer.toString(user.age)}" />
Run Code Online (Sandbox Code Playgroud)

然后我得到了错误

"错误:无法生成视图绑定器java.lang.NullPointerException"

感谢任何帮助.

更新:似乎在上面提到的错误之后发生了另一个错误.

无法生成视图绑定器java.lang.NullPointerException

不知道为什么它给我NPE即使应用还没有开始.

小智 41

好吧,六个月后,但也许我可以帮助别人.

你可以做这个简单的伎俩:

android:text="@={`` + mObject.someNumber}"
Run Code Online (Sandbox Code Playgroud)

OBS .:您至少需要Android Studio 2.3

  • 注意:这仅适用于原始类型,而不适用于BigDecimal. (3认同)

ank*_*ank 13

不知何故,我通过使用BindingAdapter和InverseBindingAdapter来实现这一点.

public class User {

    private String firstName;
    private String lastName;
    private int age;

    public User() {}

    public void setFirstName(String firstName) {
       this.firstName = firstName;
    }

    public String getFirstName() {
       return this.firstName;
    }

    public void setLastName(String lastName) {
       this.lastName = lastName;
    }

    public String getLastName() {
       return this.lastName;
    }

    public void setAge(int age) {
       this.age = age;
    }

    public int getAge() {
       return this.age;
    }

    @BindingAdapter("android:text")
    public static void setText(TextView view, int value) {
        view.setText(Integer.toString(value));
    }

    @InverseBindingAdapter(attribute = "android:text")
    public static int getText(TextView view) {
        return Integer.parseInt(view.getText().toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这也会帮助其他人.


Nim*_*kai 11

android:text="@{String.valueOf(Integer)}"

  • 它不允许编辑。问题是关于双向绑定。它还应该支持“@={...}” (11认同)

小智 6

上一个答案以及 Roberto Leinardi 的评论对我来说非常有用!我只需要补充一点,应该对罗伯托的检查进行空检查:

@BindingAdapter("android:text")
public static void setText(TextView view, int value) {
    view.setText(Integer.toString(value));
}

@BindingAdapter("android:text")
public static void setText(TextView view, int value) {
    if (view.getText() != null
            && ( !view.getText().toString().isEmpty() )
            && Integer.parseInt(view.getText().toString()) != value) {
        view.setText(Integer.toString(value));
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我设法使用Integer.toString(...)进行导入,如下所示:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <import type="java.lang.Integer" />

        <variable ... />
    </data>
Run Code Online (Sandbox Code Playgroud)