一.xml文件初始化
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="user"
type="com.hz.structure.mvvp.UserBean" />
</data>
<RelativeLayout
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"
tools:context="com.hz.structure.mvvp.MainActivity"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_user"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"
android:textColor="#000000"
android:textSize="40sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</RelativeLayout>
</layout>
还可通过import方式引入数据类
<import type="com.hz.structure.mvvp.UserBean"/>
<variable
name="user"
type="UserBean" />
引用不同目录下相同名的数据类,用alias别名
<import
type="com.hz.structure.mvc.UserBean" alias="MessUser" />
<variable
name="user"
type="MessUser" />
二.Activity中初始化
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
UserBean userBean = new UserBean();
userBean.setName("welcome to mvvp world");
mainBinding.setUser(userBean);
}
}
运行项目,最基本的DateBinding绑定就完成了.
三.双向绑定
1.数据绑定UI刷新,实现BaseObservable,用@Bindable解释需要绑定UI的数据,在数据变化时候,调用notifyChange或者notifyPropertyChanged更新UI
public class UserBean extends BaseObservable {
@Bindable
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
}
2.UI绑定数据,UI的变化,立即更新到数据,只需要在xml中@{}改为@={}
<EditText
android:id="@+id/tv_user"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@={user.name}"
android:textColor="#000000"
android:textSize="40sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
3.ObservableField可简化notifyChange的操作,为注解和刷新的封装,其实现有ObservableBoolean、ObservableByte、ObservableChar、ObservableShort、ObservableInt、ObservableLong、ObservableFloat、ObservableDouble 以及 ObservableParcelable
ObservableField<String> price = new ObservableField<String>("haha");
public ObservableField getPrice() {
return price;
}
public void setPrice(ObservableField price) {
this.price = price;
}
<TextView
android:id="@+id/tv_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="200dp"
android:text='@{user.price}'
android:textColor="#000000"
android:textSize="40sp"
app:layout_constraintLeft_toRightOf="@id/tv_user" />