记录android data binding的用法:
1, build.gradle里加入:
dataBinding {
enabled = true
}
2,布局要求:
将常规布局外面加上layout,里面 定义<data></data>标签,里面声明variable,包括name(完全自定义),type(自定义的数据Model),布局xml里的控件属性可以和Model绑定,通过name指定的变量引用 :
示例1:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="vm"
type="com.oddcn.screensharetobrowser.main.viewModel.ConnViewModel" />
</data>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:text="@{vm.connIp}" />
</layout>
示例2:
<?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">
<data>
<variable
name="vm"
type="com.mike.androidtips.databinding.Model" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="本机IP:"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{vm.localIp}"
/>
</LinearLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="给EditText赋值"
android:onClick="@{vm.setEditContent()}"/>
</layout>
3,写Model,把xml里需要bind的属性声明在里面,并且完成逻辑,比如:
public class ConnViewModel {
public ObservableField<String> connIp = new ObservableField<>();
public ConnViewModel(String connIp) {
this.connIp.set(connIp);
}
}
4, Activity的onCreate里, 通过DataBindingUtil.setContentView 方法获取到binding对象,并且给<data>赋值,binding类为自动生成,如布局为R.layout.activity_test_databinding,对应的类是ActivityTestDatabindingBinding
示例:
ActivityTestDatabindingBinding binding =null;
private void initDataBinding() {
binding = DataBindingUtil.setContentView(this, R.layout.activity_test_databinding);
binding.setVm(new Model(this));
}
5, 单向绑定和双向绑定
单向绑定: Model里面的数据变化,view里绑定了该数据的控件也随之变化
双向绑定:View里数据变化,比如edittext不断输入,输入的text会反馈给他绑定的Model里的数据。 同时,如果model里的数据变化了,绑定了该数据的view也变化
典型的双向绑定是在TextView里实时显示EditText里面的值:
即Model里定义一个ObservableField<String>,
public static ObservableField<String> editContent = new ObservableField<>();
EditText里: android:text=“@={vm.editContent }”
TextView里:android:text=“@{vm.editContent }”
6, 注:button控件的点击响应事件写法:
android:onClick="@{vm.setEditContent()}"
setEditContent在定义时要返回View.OnClickListener,对应的function写在onClick里面
7, 如果是在Fragment里使用data binding,例:
```
private FragmentMainBinding binding;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View contentView = inflater.inflate(R.layout.fragment_main, container, false);
binding = FragmentMainBinding.bind(contentView);
initView();
initEvent();
return contentView;
}
```
网友评论