一直在犹豫去写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
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 {
-
- ...
- }
光标定位在根部局上,windows使用alt + enter,mac使用option + enter:
点击Convert to data binding layout后,会生成一个layout标签包裹根部局,同时生成data标签,自动生成如下xml:
- "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>
model类用来在xml中跟view建立绑定关系,如下创建了一个Infomation的类:
- package com.example.jetpackdemo.model;
-
- public class Information {
- public String name;
- public int age;
- public String address;
- }
xml里面需要绑定model类。首先,我们在xml的data节点新增variable节点,在其中配置name为info,type则是model类的path。View和model的绑定则是通过@{info.name}这样来进行的,如下:
- "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>
build一下,生成Binding类,生成位置如下:
- 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);
- }
- }
假如我们的一个页面需要的数据不止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);
好,我们运行一下,看看效果:
通常,我们会对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的就点个赞支持一下。如果写的有问题,也希望各位不吝赐教。