参考博客:
https://www.jianshu.com/p/bd9016418af2
自动转成databind
打开布局文件,选中根布局的 ViewGroup,按住 Alt + 回车键,点击 “Convert to data binding layout”,就可以生成 DataBinding 需要的布局规则
多出了一个 layout 标签将原布局包裹了起来,data 标签用于声明要用到的变量以及变量类型,要实现 MVVM 的 ViewModel 就需要把数据(Model)与 UI(View)进行绑定,data 标签的作用就像一个桥梁搭建了 View 和 Model 之间的通道
绑定文字,绑定方法分别是:
android:text="@{String.valueOf(data.getNumber())}"
android:onClick="@{()->data.add()}"
设置默认值: android:text="@{userInfo.name,default=defaultValue}"
绑定方法可能没有提示,这里用到了 Lambda 表达式
1.作用1替代findviewbyID。可以不用data标签也支持
2.绑定。Databig绑定viewModel.同时生命周期
DataBinding 的实例名是根据布局文件名来生成,将之改为首字母大写的驼峰命名法来命名
activity_test对应的是:ActivityTestBinding
没有使用databind:
textView=findViewById(R.id.tv_test); myViewModel= ViewModelProviders.of(this).get(PengViewModel.class); myViewModel.getData().observe(this, new Observer<String>() { @Override public void onChanged(String s) { textView.setText(s); } });
使用databind第一种用法:
activityTestBinding= DataBindingUtil.setContentView(this,R.layout.activity_test); myViewModel= ViewModelProviders.of(this).get(PengViewModel.class); myViewModel.getData().observe(this, new Observer<String>() { @Override public void onChanged(String s) { activityTestBinding.tvTest.setText(s); } });
使用databind第二种用法
activityTestBinding= DataBindingUtil.setContentView(this,R.layout.activity_test); activityTestBinding.setData(myViewModel); activityTestBinding.setLifecycleOwner(this);
databing的使用:
1.直接绑定控件的值
android:text="@{String.valueOf(data.getNumber())}"
2.绑定监听事件 android:onClick="@{()->data.add()}"
public void add() { getNumber().setValue(getNumber().getValue()+1); }
<?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="data" type="com.example.myapplication.MyAndroidViewModel" /> </data> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/tv_show" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{String.valueOf(data.getNumber())}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" tools:layout_editor_absoluteX="145dp" android:onClick="@{()->data.add()}" tools:layout_editor_absoluteY="107dp"></Button> </androidx.constraintlayout.widget.ConstraintLayout> </layout>
二、单向数据绑定
实现数据变化自动驱动 UI 刷新的方式有三种:BaseObservable
、ObservableField
、ObservableCollection
三、双向数据绑定
双向绑定的意思即为当数据改变时同时使视图刷新,而视图改变时也可以同时改变数据
看以下例子,当 EditText 的输入内容改变时,会同时同步到变量
goods
,绑定变量的方式比单向绑定多了一个等号:android:text="@={goods.name}"
避免空指针异常
DataBinding 也会自动帮助我们避免空指针异常
例如,如果 "@{userInfo.password}" 中 userInfo 为 null 的话,userInfo.password 会被赋值为默认值 null,而不会抛出空指针异常