Android DataBinding学习(一) :基础应用(Kotlin版本)

文章目录

  • Android DataBinding学习(一):基础应用
    • 一.DataBinding介绍
    • 二.基础应用
      • 1.gradle配置
      • 2.简单使用
        • 0x00.XML中的DataBinding使用
        • 0x01.数据类
        • 0x02.data中声明变量及类全名
          • (1)直接使用variable
          • (2)使用import
        • 0x03.variable绑定到UI界面
          • include的情况
        • 0x04.Activity编码
          • 小补丁
    • 三.总结

Android DataBinding学习(一):基础应用

一.DataBinding介绍

DataBinding是google官方推出的用于降低UI和业务代码耦合的技术,很好的使用DataBnding可以有效的减少Activity的臃肿,省去大量的findViewById的代码使用。

二.基础应用

1.gradle配置

gradle的配置其实并不复杂。只需要开启对于DataBinding的支持。
在android{}里面加上下面的代码支持。

	// 用来判断是否开启DataBinding功能
    buildFeatures{
        dataBinding = true
    }

google官网关于DataBinding最新版本和gradle开启DataBinding支持的描述:
Google官方Databinding

2.简单使用

对于DataBinding而言主要是两方面的编码。Activity和xml以及数据Model的编码,首先看看xml方面的编码。

0x00.XML中的DataBinding使用

在构建XML中的databinding布局,可以使用AndroidStudio快捷组合键"alt+enter"后,选择点击 “Convert to data binding layout”,来快速生成dataBinding布局。代码如下:


<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:id="@+id/user_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="user_name"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
        
        <TextView
            android:id="@+id/user_age"
            app:layout_constraintTop_toBottomOf="@id/user_name"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            android:layout_marginTop="10dp"
            android:text="user_age"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    androidx.constraintlayout.widget.ConstraintLayout>
layout>

注意到这里将xml根代码的换成了 同时多出了

0x01.数据类

data class User(var age: Int, var name: String)

这里直接使用kotlin的Data类,该类类似于Java Bean类。当然你也可以直接创建常规的Class类。

0x02.data中声明变量及类全名

在data中声明变量有两种方法:

(1)直接使用variable
	<data>
        <variable
            name="user"
            type="com.work.binding.practice.data.User" />
    data>

variable的意思是"变量",顾名思义,你需要绑定的数据类就是写在这里面。name类似于Java的变量名,type类似于Java的类名,但是需要注意,这里必须给出完全路径。通过这个"variable"可以解析到数据类。

(2)使用import
	<data>
        <import type="com.work.binding.practice.data.User"/>
        <variable
            name="user"
            type="User" />
    data>

这里使用了import这个也是类似于Java的import,引入包名。name改成数据类的类名。

0x03.variable绑定到UI界面

通过@{}绑定到UI界面上,代码如下:


<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>
        <import type="com.work.binding.practice.data.User"/>
        <variable
            name="user"
            type="User" />
    data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".activity.MainActivity">

        <TextView
            android:id="@+id/user_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
	
        <TextView
            android:id="@+id/user_age"
            app:layout_constraintTop_toBottomOf="@id/user_name"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            android:layout_marginTop="10dp"
            android:text="@{String.valueOf(user.age)}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    androidx.constraintlayout.widget.ConstraintLayout>
layout>
include的情况



<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>
        <import type="com.work.binding.practice.data.User"/>
        <variable
            name="user"
            type="User" />
    data>
    
   	
	<include
		android:layout_width="match_parent"
    	android:layout_height="wrap_content"
    	layout="@layout/layout_title"
    	app:user="@{user}"/>
    	......省略代码......
layout>


<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>
        <import type="com.work.binding.practice.data.User"/>
        <variable
            name="user"
            type="User" />
    data>
    ......省略代码......

DataBinding不支持merge。

0x04.Activity编码

由于使用了DataBinding就可以不需要使用传统的setContentView(R.layout.activity_main),而是使用DataBindingUtil。代码如下:

class MainActivity : AppCompatActivity() {

	// 使用空安全操作符'?'
    private var activityMainBinding:ActivityMainBinding? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        // 设置数据类给ActivityMainBinding
        activityMainBinding?.user = User(21, "Jack")
    }
}

由于我们使用了Kotlin所以其实上面的代码可以继续简化

class MainActivity : AppCompatActivity() {

    private val activityMainBinding:ActivityMainBinding by lazy {
        DataBindingUtil.setContentView(this, R.layout.activity_main)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 设置数据类给ActivityMainBinding,这里不需要使用空安全修饰符了
        activityMainBinding.user = User(21, "Jack")
    }
}

使用by lazy技术简化了一下,缺点是变量必须得是val属性的。
通过以上的编码,我们就可以成功的将User的数据显示到UI上面了。

小补丁

(1) ActivityMainBinding类是插件自动生成的代码,该代码继承自ViewDataBinding,命名规则是基于xml的,xml名称是"activity_main",那么生成的代码就是ActivityMain后面加上’Binding’。
(2) ActivityMainBinding类可以调用XML上面的UI,比如上面的代码可以调用XML中的两个TextView,以及rootView

三.总结

通过以上的编码可以看到使用DataBinding技术可以大大减少Activity的代码,减少Activity的臃肿。看到这里,大家可能在想如何更新UI界面上的数据呢?在下个文章我们将解决这个问题!

你可能感兴趣的:(Jetpack学习,android,kotlin,java)