Android开发:Databinding的使用

本文介绍了如何在Android项目中使用Databinding技术,包括添加数据绑定依赖,将布局转换为databindinglayout,创建ViewModel并将其与布局文件中的视图绑定,以及处理点击事件和双向数据绑定的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Databinding

image-20231017110309188

添加依赖

在bulid.gradle中添加依赖

buildFeatures {
        dataBinding true
        viewBinding true    
    }

转换布局

将布局转换为data binding layout

alt + enter 选择 Convert to data binding layout

image-20231016173704568

代码演示:

导入ViewModel相关依赖

const val LIVEDATA_KTX = "androidx.lifecycle:lifecycle-livedata-ktx:2.6.2"
const val VIEWMODEL_KTX = "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1"

创建ViewModel类

这里用了一个属性和方法,用于演示

class LgViewModel : ViewModel() {
    var name = MutableLiveData("张三")

    fun changeData() {
        name.postValue("李四")
    }
}

在布局文件中添加变量:

注意:类名前需要有包名

<data>
        <variable
            name="viewModel"
            type="com.wuliner.login.LgViewModel" />
    </data>

添加ViewModel

class LgPhoneFragment : Fragment() {
    private lateinit var binding: FragmentLgPhoneBinding
    private val loginViewModel: LgViewModel by activityViewModels()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentLgPhoneBinding.inflate(inflater, container, false)
        binding.viewModel = loginViewModel
        binding.lifecycleOwner = this
        binding.executePendingBindings()
        return binding.root
    }
}

注意:

  • 这里通过by activityViewModels()创建ViewModel,这样同一个Activity上的Fragment就能共享同一个ViewModel

  • 将创建的viewModel赋给视图的viewModel后,还需要binding.lifecycleOwner = this,t同步生命周期,再通过binding.executePendingBindings()绑定数据

在布局文件中添加按钮和textView用于测试

使用data中定义变量的格式:@{变量名}

这里将TextView的text设为viewModel.name

<TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="164dp"
            android:text="@{viewModel.name}"
            android:textColor="@color/white"
            android:textSize="30sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.498"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="84dp"
            android:text="Button"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.498"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView" />

运行后,textView的text就会显示ViewModel的默认值“张三”

image-20231016180652737

处理点击事件

绑定适配器

添加kapt (在module的build.gradle添加)

image-20231016181407675

创建点击事件:

class ClickEvent {
    @BindingAdapter("changeData")
    fun changeData(view: View, viewModel: LgLoginViewModel) {
        viewModel.changeData()
    }
}

在上面的代码中创建了一个类,changeData方法就是需要处理的点击事件,需要添加@BindingAdapter注解

在xml布局文件中:声明刚才创建的类型的变量

<variable
	name="events"
  type="com.wuliner.login.ClickEvent" />            

创建ClickEvent,赋给event

image-20231017102852958

给控件添加点击事件

android:onClick="@{(view)->events.changeData(view, viewModel)}"中,view参数即当前的Button

<Button
	android:id="@+id/button"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginTop="84dp"
  android:text="Button"
  android:onClick="@{(view)->events.changeData(view, viewModel)}"
  app:layout_constraintEnd_toEndOf="parent"
  app:layout_constraintHorizontal_bias="0.498"
  app:layout_constraintStart_toStartOf="parent"
  app:layout_constraintTop_toBottomOf="@+id/textView" />            

属性绑定:

双向绑定

绑定多个属性:

image-20231020082842284

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值