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
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)
希望这也会帮助其他人.
小智 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)
| 归档时间: |
|
| 查看次数: |
17285 次 |
| 最近记录: |