JoJo的个人博客

记录精彩的程序人生

目录
Jetpack系列之数据绑定
/    

Jetpack系列之数据绑定

前言

随着GoogleDataBinding的不断支持和升级,已经比以前好用了很多,特别是AndroidStudio不再需要编译一下才能识别xml了,另外不止能够支持ObservableField,现在还能支持LiveData,已经成为了Jetpack系列中重要成员之一。

我使用并封装了JetPack系列组件的用法,java版参考代码 JetPackDemo

开启

在项目中开启DataBinding,只需在build.gradle文件中设置

android {
...
    buildFeatures {
       dataBinding true
    }
}

转换layout为Data Binding layout

  1. 使用<layout>标签包裹布局
  2. 添加variables(可选)
  3. 添加布局表达式(可选)

例如

<?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="viewmodel"
            type="com.tianyang.jetpackdemo.ui.home.HomeViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
...

</layout>

布局表达式

// Some examples of complex layout expressions
android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'

也可以使用一键转换功能

绑定xml

设置data标签

<data>
    <variable name="name" type="String"/>
    <variable
          name="viewmodel"
          type="com.tianyang.jetpackdemo.ui.home.HomeViewModel" />
</data>

单项绑定

<TextView
    android:id="@+id/plain_name"
    android:text="@{name}" 
... />

双向绑定

<TextView
    android:id="@+id/plain_name"
    android:text="@={name}" 
... />

绑定方法

android:onClick="@{() -> viewmodel.onLike()}"

修改加载布局的方式

Activity布局加载

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

Fragment布局加载

FragmentMainBinding binding DataBindingUtil.inflate(getLayoutInflater(), R.layout.fragment_main, null, false)

使用ViewDataBinding直接加载

ItemArticleListBinding binding = ItemArticleListBinding.inflate(LayoutInflater.from(parent.getContext()));

使用DataBinding

设置xml中的Data数据源

binding.setName(nName)
binding.setViewmodel(mViewModel);

替换findViewById

binding.name = "Your name"
binding.lastName = "Your last name"

与LiveData和ViewModel结合使用

ViewModel设置数据类型为LiveData,可以设置初始值

public class HomeViewModel extends BaseViewModel {
    MutableLiveData<String> email = new MutableLiveData<>("aa");
    MutableLiveData<String> password = new MutableLiveData<>();
    MutableLiveData<String> text = new MutableLiveData<>("");
}

xml中进行绑定或者双向绑定,有=号就是双向绑定

<data>

    <variable
        name="viewmodel"
        type="com.tianyang.jetpackdemo.ui.home.HomeViewModel" />
 </data>
 ...
 <EditText
      android:id="@+id/username"
      android:text="@={viewmodel.email}"
 ... 

activity或者fragment只设置ViewModelLifecycle

mBinding.setViewmodel(mViewModel);
mBinding.setLifecycleOwner(this);

使用Binding Adapters来定制化行为

@BindingAdapter("app:hideIfZero")
fun hideIfZero(view: View, number: Int) {
    view.visibility = if (number == 0) View.GONE else View.VISIBLE
}

使用

<ProgressBar
       android:id="@+id/progressBar"
       app:hideIfZero="@{viewmodel.likes}"
...

使用多个属性

@BindingAdapter(value = ["app:progressScaled", "android:max"], requireAll = true)
fun setProgress(progressBar: ProgressBar, likes: Int, max: Int) {
    progressBar.progress = (likes * max / 5).coerceAtMost(max)
}
<ProgressBar
       android:id="@+id/progressBar"
       app:hideIfZero="@{viewmodel.likes}"
       app:progressScaled="@{viewmodel.likes}"
       android:max="@{100}"
...

参考文章

Android开发者文档-数据绑定库

Data Binding in Android


标题:Jetpack系列之数据绑定
作者:SunnySky
地址:https://www.tianyang.pub/articles/2020/07/03/1593759719797.html

评论