Jetpack组件(二)DataBinding

    一直在犹豫去写Jetpack组件的一系列文章,实话实说,我本身的项目中也很少有使用到Jetpack的一些库。那么在写文章之前,我还是要去实际的写demo。准备按照Architecture(架构)、Foundation(基础)、Behavior(行为)和UI(界面)的顺序去写。本篇先总结一下DataBinding的基本使用。

目录

一、友情提示

二、dataBinding基本使用

1、打开dataBinding功能

2、Convert to data binding layout

3、创建model类

4、xml中绑定view和model

5、生成DataBinding类

6、获取DataBinding对象,绑定数据

7、运行效果

8、多数据源

9、操作View


一、友情提示

  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的就点个赞支持一下。如果写的有问题,也希望各位不吝赐教。

猜你喜欢

转载自blog.csdn.net/qq_21154101/article/details/128111485