一直在犹豫去写Jetpack组件的一系列文章,实话实说,我本身的项目中也很少有使用到Jetpack的一些库。那么在写文章之前,我还是要去实际的写demo。准备按照Architecture(架构)、Foundation(基础)、Behavior(行为)和UI(界面)的顺序去写。本篇先总结一下DataBinding的基本使用。
目录
2、Convert to data binding layout
一、友情提示
jetpack组件的基本构成
Jetpack系列文章上一篇
Jetpack是什么?相信做Android开发的同学都或多或少地听过或用过Jetpack,即使你认为自己没用过,但实际上你可能 已经不知不觉中用过了。因为Jetpack组件库非常庞大,它包含了很多的优秀组件。本篇不去详细展开介绍Jetpack组件库的某个或某些组件,只做一个简介,后续准备用一系列的文章来详细介绍Jetpack组件库的常用组件。https://blog.csdn.net/qq_21154101/article/details/128062843Jetpack系列文章下一篇Jetpack组件(三)Lifecycle_heart荼毒的博客-CSDN博客本篇是Jetpack组件系列文章的第三篇,将介绍第二个组件Lifecycles。Lifecycles为开发者管理 Activity 和 Fragment 生命周期提供了极大的便利,帮助开发者书写更轻量、易于维护的代码。https://blog.csdn.net/qq_21154101/article/details/128250512
二、dataBinding基本使用
1、打开dataBinding功能
build.gradle 文件中的 android 节点里添加 dataBinding 配置。AGP4.0以上可以使用buidFeatures,当然都支持第二种方式:
/*buildFeatures {
dataBinding true
}*/
dataBinding {
enabled = true
}
具体位置如下:
plugins {
id 'com.android.application'
}
android {
...
/*buildFeatures {
dataBinding true
}*/
dataBinding {
enabled = true
}
}
dependencies {
...
}
2、Convert to data binding layout
光标定位在根部局上,windows使用alt + enter,mac使用option + enter:
点击Convert to data binding layout后,会生成一个layout标签包裹根部局,同时生成data标签,自动生成如下xml:
<?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>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
3、创建model类
model类用来在xml中跟view建立绑定关系,如下创建了一个Infomation的类:
package com.example.jetpackdemo.model;
public class Information {
public String name;
public int age;
public String address;
}
4、xml中绑定view和model
xml里面需要绑定model类。首先,我们在xml的data节点新增variable节点,在其中配置name为info,type则是model类的path。View和model的绑定则是通过@{info.name}这样来进行的,如下:
<?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="info"
type="com.example.jetpackdemo.model.Information" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{info.name}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{String.valueOf(info.age)}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/name" />
<TextView
android:id="@+id/address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{info.address}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/age" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
5、生成DataBinding类
build一下,生成Binding类,生成位置如下:
6、获取DataBinding对象,绑定数据
package com.example.jetpackdemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import android.os.Bundle;
import com.example.jetpackdemo.databinding.ActivityMainBinding;
import com.example.jetpackdemo.model.Information;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
initInfo(binding);
}
private void initInfo(ActivityMainBinding binding) {
Information info = new Information();
info.name = "aaa";
info.age = 18;
info.address = "shanghai";
binding.setInfo(info);
}
}
7、运行效果
8、多数据源
假如我们的一个页面需要的数据不止name、age、addres三个基本信息属性。我想定义用户喜好,比如用户最喜欢的颜色color,最喜欢的水果fruit。可能有同学会说,这有什么,直接在Information类中增加两个属性color和fruit呗。
这样固然是可以做到,但是终归跟name、age、addres三个基本信息有差别。因此,我们新定义一个model类叫做Favorite,并且增加两个属性color和fruit。此后如果增加用户的喜好项,我们可以直接在这个类去扩展。
package com.example.jetpackdemo.model;
public class Favorite {
public String color;
public String fruit;
}
那么,如何在xml和java代码里面去写?
首先,xml只能有一个data标签,但是data标签可以配置多个数据源。因此,我们在data标签再新增一个variable:
<data>
<variable
name="info"
type="com.example.jetpackdemo.model.Information" />
<variable
name="favorite"
type="com.example.jetpackdemo.model.Favorite" />
</data>
同时,增加两个Textview跟新增的variable去做绑定:
<TextView
android:id="@+id/color"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{favorite.color}"
android:textSize="20sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/address" />
<TextView
android:id="@+id/fruit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{favorite.fruit}"
android:textSize="20sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/color" />
注意,修改完xml后,手动build一下,生成新的DataBinding类。然后,在java代码中初始化数据源:
Favorite favorite = new Favorite();
favorite.color = "yellow";
favorite.fruit = "apple";
binding.setFavorite(favorite);
好,我们运行一下,看看效果:
9、操作View
通常,我们会对View设置一些事件(例如点击事件),或者设置可见性等等。那么在使用了DataBinding,没有findViewById和定义View变量的情况下,如何去操作具体的View,下面代码以设置点击事件为例:
binding.age.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"click",Toast.LENGTH_LONG).show();
}
});
本篇总结了Jetpack组件库的第一个组件库DataBinding的使用,包括如何在gradle配置dataBinding开关,如何生成xml,数据绑定,多数据源的使用等等,这只是最基本的使用。其实抛开livedata、viewmodel等单独写dataBinding,不太科学。后续会持续进行Jetpack组件库的总结,大家觉得还ok的就点个赞支持一下。如果写的有问题,也希望各位不吝赐教。