DataBinding动态改变数据
DataBinding减少了java逻辑代码与xml布局的交互,不仅体现在省去了findViewById(),还体现在动态的数据改变。例如:我们不使用框架要去改变一个TextView的文本信息,则需要用TextView的对象去调用setText( )方法。使用DataBinding则不需要如此。
DataBinding提供了动态改变数据的方式。
一、具体实现:
1、xml布局:
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="com.xhx.databinding.databindingtest.MainActivity">
<data>
<import type="com.xhx.databinding.databindingtest.Main2Activity"/>
<import type="com.xhx.databinding.databindingtest.DataBean"/>
<variable
name="main2"
type="Main2Activity"/>
<variable
name="data"
type="DataBean"/>
</data>
<!--android studio 2.3自动生成的容器组件-->
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout_editor_absoluteY="0dp"
tools:layout_editor_absoluteX="0dp">
<Button
<!--监听的实现如果看不懂请看上一篇中的事件绑定部分-->
android:onClick="@{main2.clickListner}"
android:id="@+id/btn_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击改变TextView文字类容"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginTop="16dp"
app:layout_constraintTop_toBottomOf="@+id/tv_long" />
<TextView
android:id="@+id/tv_long"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{data.str_text}"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="16dp"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent" />
</android.support.constraint.ConstraintLayout>
</layout>
2、DataBean实现类:
第一步:继承BaseObservable观察者
第二步:在需要改变的变量对应的get方法上添加注解:@Bindable
第三步:在对应的set方法中调用notifyPropertyChanged()并传入(BR.变量名)。
import android.databinding.BaseObservable;
import android.databinding.Bindable;
//继承BaseObservable观察者
public class DataBean extends BaseObservable{
String str_text;
public DataBean(String str_text) {
this.str_text = str_text;
}
//添加@Bindable
@Bindable
public String getStr_text() {
return str_text;
}
//在此调用
public void setStr_text(String str_text) {
this.str_text = str_text;
//此处可能报红,因为还未进行编译,BR文件中还未生成str_text
notifyPropertyChanged(BR.str_text);
}
}
3、Activity代码:
public class Main2Activity extends AppCompatActivity {
DataBean dataBean;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_test);
ViewDataBinding binding = DataBindingUtil.setContentView(this, R.layout.include_layout);
dataBean=new DataBean("改变前的文本");
//此处可能报红,因为还未进行编译,main2、data在BR文件中还未生成
binding.setVariable(BR.main2,this);
binding.setVariable(BR.data,dataBean);
}
public void clickListner(View view){
dataBean.setStr_text("改变后的文本");
}
}