記錄android data binding的用法:
1, build.gradle里加入:?
?dataBinding {?
?????enabled = true
?}
2贩幻,布局要求:
將常規(guī)布局外面加上layout帜乞,里面 定義<data></data>標(biāo)簽,里面聲明variable,包括name(完全自定義),type(自定義的數(shù)據(jù)Model),布局xml里的控件屬性可以和Model綁定峡钓,通過(guò)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="本機(jī)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,寫(xiě)Model若河,把xml里需要bind的屬性聲明在里面能岩,并且完成邏輯,比如:
public class ConnViewModel {
? ? public ObservableField<String> connIp = new ObservableField<>();
? ? public ConnViewModel(String connIp) {
? ? ? ? this.connIp.set(connIp);
? ? }
}
4, Activity的onCreate里萧福, 通過(guò)DataBindingUtil.setContentView 方法獲取到binding對(duì)象拉鹃,并且給<data>賦值,binding類(lèi)為自動(dòng)生成鲫忍,如布局為R.layout.activity_test_databinding膏燕,對(duì)應(yīng)的類(lèi)是ActivityTestDatabindingBinding?
示例:
ActivityTestDatabindingBinding binding =null;
private void initDataBinding() {
????binding = DataBindingUtil.setContentView(this, R.layout.activity_test_databinding);
????binding.setVm(new Model(this));
}
5, 單向綁定和雙向綁定
單向綁定: Model里面的數(shù)據(jù)變化,view里綁定了該數(shù)據(jù)的控件也隨之變化?
雙向綁定:View里數(shù)據(jù)變化悟民,比如edittext不斷輸入坝辫,輸入的text會(huì)反饋給他綁定的Model里的數(shù)據(jù)。 同時(shí)射亏,如果model里的數(shù)據(jù)變化了近忙,綁定了該數(shù)據(jù)的view也變化?
典型的雙向綁定是在TextView里實(shí)時(shí)顯示EditText里面的值:
即Model里定義一個(gè)ObservableField<String>,?
public static ObservableField<String> editContent = new ObservableField<>();
EditText里:? android:text=“@={vm.editContent?}”?
TextView里:android:text=“@{vm.editContent?}”?
6, 注:button控件的點(diǎn)擊響應(yīng)事件寫(xiě)法:
android:onClick="@{vm.setEditContent()}"?
setEditContent在定義時(shí)要返回View.OnClickListener,對(duì)應(yīng)的function寫(xiě)在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;?
?}
```