• 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,当然都支持第二种方式:

    1. /*buildFeatures {
    2. dataBinding true
    3. }*/
    4. dataBinding {
    5. enabled = true
    6. }

     具体位置如下:

    1. plugins {
    2. id 'com.android.application'
    3. }
    4. android {
    5. ...
    6. /*buildFeatures {
    7. dataBinding true
    8. }*/
    9. dataBinding {
    10. enabled = true
    11. }
    12. }
    13. dependencies {
    14. ...
    15. }

    2、Convert to data binding layout

    光标定位在根部局上,windows使用alt + enter,mac使用option + enter:

     点击Convert to data binding layout后,会生成一个layout标签包裹根部局,同时生成data标签,自动生成如下xml:

    1. "1.0" encoding="utf-8"?>
    2. <layout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools">
    5. <data>
    6. data>
    7. <androidx.constraintlayout.widget.ConstraintLayout
    8. android:layout_width="match_parent"
    9. android:layout_height="match_parent"
    10. tools:context=".MainActivity">
    11. <TextView
    12. android:layout_width="wrap_content"
    13. android:layout_height="wrap_content"
    14. android:text="Hello World!"
    15. app:layout_constraintBottom_toBottomOf="parent"
    16. app:layout_constraintEnd_toEndOf="parent"
    17. app:layout_constraintStart_toStartOf="parent"
    18. app:layout_constraintTop_toTopOf="parent" />
    19. androidx.constraintlayout.widget.ConstraintLayout>
    20. layout>

    3、创建model类

        model类用来在xml中跟view建立绑定关系,如下创建了一个Infomation的类:

    1. package com.example.jetpackdemo.model;
    2. public class Information {
    3. public String name;
    4. public int age;
    5. public String address;
    6. }

    4、xml中绑定view和model

        xml里面需要绑定model类。首先,我们在xml的data节点新增variable节点,在其中配置name为info,type则是model类的path。View和model的绑定则是通过@{info.name}这样来进行的,如下:

    1. "1.0" encoding="utf-8"?>
    2. <layout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools">
    5. <data>
    6. <variable
    7. name="info"
    8. type="com.example.jetpackdemo.model.Information" />
    9. data>
    10. <androidx.constraintlayout.widget.ConstraintLayout
    11. android:layout_width="match_parent"
    12. android:layout_height="match_parent"
    13. tools:context=".MainActivity">
    14. <TextView
    15. android:id="@+id/name"
    16. android:layout_width="wrap_content"
    17. android:layout_height="wrap_content"
    18. android:text="@{info.name}"
    19. app:layout_constraintStart_toStartOf="parent"
    20. app:layout_constraintTop_toTopOf="parent" />
    21. <TextView
    22. android:id="@+id/age"
    23. android:layout_width="wrap_content"
    24. android:layout_height="wrap_content"
    25. android:text="@{String.valueOf(info.age)}"
    26. app:layout_constraintStart_toStartOf="parent"
    27. app:layout_constraintTop_toBottomOf="@+id/name" />
    28. <TextView
    29. android:id="@+id/address"
    30. android:layout_width="wrap_content"
    31. android:layout_height="wrap_content"
    32. android:text="@{info.address}"
    33. app:layout_constraintStart_toStartOf="parent"
    34. app:layout_constraintTop_toBottomOf="@+id/age" />
    35. androidx.constraintlayout.widget.ConstraintLayout>
    36. layout>

    5、生成DataBinding类

        build一下,生成Binding类,生成位置如下:

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

    1. package com.example.jetpackdemo;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import androidx.databinding.DataBindingUtil;
    4. import android.os.Bundle;
    5. import com.example.jetpackdemo.databinding.ActivityMainBinding;
    6. import com.example.jetpackdemo.model.Information;
    7. public class MainActivity extends AppCompatActivity {
    8. @Override
    9. protected void onCreate(Bundle savedInstanceState) {
    10. super.onCreate(savedInstanceState);
    11. ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
    12. initInfo(binding);
    13. }
    14. private void initInfo(ActivityMainBinding binding) {
    15. Information info = new Information();
    16. info.name = "aaa";
    17. info.age = 18;
    18. info.address = "shanghai";
    19. binding.setInfo(info);
    20. }
    21. }

    7、运行效果

      

    8、多数据源

        假如我们的一个页面需要的数据不止name、age、addres三个基本信息属性。我想定义用户喜好,比如用户最喜欢的颜色color,最喜欢的水果fruit。可能有同学会说,这有什么,直接在Information类中增加两个属性color和fruit呗。

        这样固然是可以做到,但是终归跟name、age、addres三个基本信息有差别。因此,我们新定义一个model类叫做Favorite,并且增加两个属性color和fruit。此后如果增加用户的喜好项,我们可以直接在这个类去扩展。

    1. package com.example.jetpackdemo.model;
    2. public class Favorite {
    3. public String color;
    4. public String fruit;
    5. }

        那么,如何在xml和java代码里面去写?

        首先,xml只能有一个data标签,但是data标签可以配置多个数据源。因此,我们在data标签再新增一个variable:

    1. <data>
    2. <variable
    3. name="info"
    4. type="com.example.jetpackdemo.model.Information" />
    5. <variable
    6. name="favorite"
    7. type="com.example.jetpackdemo.model.Favorite" />
    8. data>

        同时,增加两个Textview跟新增的variable去做绑定:

    1. <TextView
    2. android:id="@+id/color"
    3. android:layout_width="wrap_content"
    4. android:layout_height="wrap_content"
    5. android:text="@{favorite.color}"
    6. android:textSize="20sp"
    7. app:layout_constraintStart_toStartOf="parent"
    8. app:layout_constraintTop_toBottomOf="@+id/address" />
    9. <TextView
    10. android:id="@+id/fruit"
    11. android:layout_width="wrap_content"
    12. android:layout_height="wrap_content"
    13. android:text="@{favorite.fruit}"
    14. android:textSize="20sp"
    15. app:layout_constraintStart_toStartOf="parent"
    16. app:layout_constraintTop_toBottomOf="@+id/color" />

        注意,修改完xml后,手动build一下,生成新的DataBinding类。然后,在java代码中初始化数据源:

    1. Favorite favorite = new Favorite();
    2. favorite.color = "yellow";
    3. favorite.fruit = "apple";
    4. binding.setFavorite(favorite);

        好,我们运行一下,看看效果:

    9、操作View

        通常,我们会对View设置一些事件(例如点击事件),或者设置可见性等等。那么在使用了DataBinding,没有findViewById和定义View变量的情况下,如何去操作具体的View,下面代码以设置点击事件为例:

    1. binding.age.setOnClickListener(new View.OnClickListener() {
    2. @Override
    3. public void onClick(View v) {
    4. Toast.makeText(MainActivity.this,"click",Toast.LENGTH_LONG).show();
    5. }
    6. });

     

        本篇总结了Jetpack组件库的第一个组件库DataBinding的使用,包括如何在gradle配置dataBinding开关,如何生成xml,数据绑定,多数据源的使用等等,这只是最基本的使用。其实抛开livedata、viewmodel等单独写dataBinding,不太科学。后续会持续进行Jetpack组件库的总结,大家觉得还ok的就点个赞支持一下。如果写的有问题,也希望各位不吝赐教。

  • 相关阅读:
    【C++】深度解剖多态
    ORA-00257:archiver error.Connect internal only,until freed.
    马斯克调整了Twitter API服务方案
    MySQL---搜索引擎
    git 版本管理
    【C语言】自定义类型:结构体【结构体内存具详细】,枚举,联合
    【Java 基础篇】Java线程同步:Lock接口详解
    免费享受企业级安全:雷池社区版WAF,高效专业的Web安全的方案
    代理模式——静态代理和动态代理
    第10章 PCA降维技术
  • 原文地址:https://blog.csdn.net/qq_21154101/article/details/128111485