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

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布局。代码如下:

<?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: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根代码的换成了<layout></layout> 同时多出了<data></data>

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界面上,代码如下:

<?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>
        <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" />
	<!--这里注意使用String.valueOf将int转成String,不然会报错-->
        <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的情况
<!--activity_main.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>
        <import type="com.work.binding.practice.data.User"/>
        <variable
            name="user"
            type="User" />
    </data>
    <!--使用include加上android:layout_width和android:layout_height,避免include代码显示不了-->
   	<!--app:user="@{user}"需要和variable的name一样-->
	<include
		android:layout_width="match_parent"
    	android:layout_height="wrap_content"
    	layout="@layout/layout_title"
    	app:user="@{user}"/>
    	......省略代码......
</layout>

<!--activity_sub.xml-->
<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
(3) 要想得到ActivityMainBinding类,必须在所在的"activity_main"中,生产dataBinding布局,才能有ActivityMainBinding类。

三.总结

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rockyou666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值