当前位置: 首页 > news >正文

Jetpack 中的 databinding - 使用篇

什么叫databinding

数据绑定库是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。使用数据绑定可以简化 findViewById 。

如何使用

应用模块下 build.gradle 文件中添加 dataBinding 元素,如下

dataBinding {enabled = true
}

单向绑定

activity_list

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="user"type="com.gxx.databinding.data.UserData" /></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@{user.userName}" /><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="@{String.valueOf(user.age)}" /></LinearLayout>
</layout>

ListActivity

class ListActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)var binding =DataBindingUtil.setContentView<ActivityListBinding>(this, R.layout.activity_list)binding.lifecycleOwner = thisvar userData = UserData()userData.age = 10userData.userName = "你好"binding.user = userData}
}

 UserData

class UserData {var userName: String? = nullvar age: Int = 0
}

可观察的数据对象

任何 plain-old 对象都可用于数据绑定,但修改对象不会自动使界面更新。通过数据绑定,数据对象可在其数据发生更改时通知其他对象,即监听器,可观察类有三种不同类型:对象、字段和集合。当其中一个可观察数据对象绑定到界面并且该数据对象的属性发生更改时,界面会自动更新。

结合 LiveData 将数据变化通知给界面

ViewModelActivity
class ViewModelActivity : AppCompatActivity() {private lateinit var userViewModel: UserViewModeloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val binding = DataBindingUtil.setContentView<ActivityViewmodelBinding>(this,R.layout.activity_viewmodel)binding.lifecycleOwner = thisuserViewModel = ViewModelProvider(this,ViewModelProvider.NewInstanceFactory()).get(UserViewModel::class.java)binding.viewModel = userViewModel}
}

UserViewModel

class UserViewModel : ViewModel() {val userLiveData = MutableLiveData<UserData>()init {thread {for (x in 1..10) {Log.d("TAG", "服务器给你推送消息啦{叮咚声音}$x")val userData = UserData()//userData.userName.set("接收服务器声音$x")userData.userName = "接收服务器声音$x"userLiveData.postValue(userData)Thread.sleep(2000)}}}
}
class UserData : BaseObservable() {val userName: ObservableField<String> by lazy { ObservableField<String>() }var age: Int = 0
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="viewModel"type="com.gxx.databinding.viewmodel.UserViewModel" /></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@={viewModel.userLiveData.userName}" /><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@={viewModel.userLiveData.userName}" /></LinearLayout>
</layout>

http://www.lryc.cn/news/127321.html

相关文章:

  • C++之signal信号应用实例(一百七十六)
  • 【数据分析入门】Numpy进阶
  • 数据结构的图存储结构
  • 爬虫IP时效问题:优化爬虫IP使用效果实用技巧
  • 【uniapp】picker mode=“region“ 最简单的省市区 三级联动
  • 解决Java中的“Unchecked cast: java.lang.Object to java.util.List”问题
  • 我的创作纪念日(128天)
  • 30W IP网络有源音箱 校园广播音箱
  • 什么是DNS服务器的层次化和分布式?
  • Django图书商城系统实战开发-部署上线操作
  • Springboot 实践(1)MyEclipse2019创建maven工程
  • 41 | 京东商家书籍评论数据分析
  • 【数据挖掘】如何保证数据一致性?
  • 深度学习AIGC问答
  • 大数据第二阶段测试(二)
  • 【mysql报错解决】MySql.Data.MySqlClient.MySqlException (0x80004005)或1366
  • Kafka-eagle监控平台
  • ubuntu16.04制作本地apt源离线安装
  • 【Leetcode】91.解码方法
  • easyx图形库基础:2.基本运动+键盘交互
  • 计算机竞赛 opencv 图像识别 指纹识别 - python
  • UI自动化测试常见的Exception
  • 魔棒:手机智能无人直播软件多少钱?
  • 网络安全 Day-32 Linux 系统定时任务补充
  • 【OpenGauss源码学习 —— 执行算子(hash join 算子)】
  • [Go版]算法通关村第十二关青铜——不简单的字符串转换问题
  • 十种排序算法(附动图)
  • 【校招VIP】测试类型之兼容性测试分析
  • STM32--TIM定时器(1)
  • Android取证——基础知识