developer.android数据绑定库
数据绑定库是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。
布局通常是使用调用界面框架方法的代码在 Activity 中定义的。例如,以下代码调用 findViewById() 来查找TextView,再设置属性。
TextView tv = findViewById(R.id.textView);
tv.setText(viewModel.getUserName());
使用databinding可以直接在布局文件中使用数据绑定将温杯直接分配个组件。使用@{}赋值
<TextView
android:text="@{viewmodel.userName}" />
借助布局文件中的绑定组件,您可以移除 Activity 中的许多界面框架调用,使其维护起来更简单、方便。还可以提高应用性能,并且有助于防止内存泄漏以及避免发生 Null 指针异常。
使用
1.Module: app 配置dataBinding
Module: app
android {
......
dataBinding {
enabled = true
}
}
2.修改.xml文件:使用<layout> <data></data></layout> 包裹
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewmodel"
type="com.myapp.data.Idol" />
<variable
name="viewmodel"
type="com.myapp.data.ViewModel" /> //结合ViewMode
</data>
<TextView android:text="@{Idol.userName}" />
</layout>
3.Activity(DataBindingUtil.setContentView())
ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
activityMainBinding.setIdol(new Idol("zhang", "5",""));
4.与ViewModel、LiveData一起使用
public class MyViewModel extends ViewModel {
private MutableLiveData<Integer> progress;
public MutableLiveData<Integer> getProgress() {
if (null == progress) {
progress = new MutableLiveData<>();
progress.setValue(0);
}
return progress;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
final MyViewModel myViewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyViewModel.class);
activityMainBinding.setMyViewModel(myViewModel);
activityMainBinding.setLifecycleOwner(this); //必须调用,不然databinding不能坚挺LiveData的变化
myViewModel.getProgress().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
MutableLiveData<Integer> progress = myViewModel.getProgress();
Log.d(TAG, "onChanged: "+ progress);
}
});
}