DataBinding

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);
    }
  });
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容