Databinding(kotlin)

简单使用(只作为view获取)

  1. build.gradle.kts配置
java 复制代码
android {
    dataBinding {
        enable = true
    }
  }
  1. activity注入
java 复制代码
//setContentView(R.layout.activity_main)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
  1. xml配置(只需要binding组件而不需要binding数据时,可以将<data></data>删除)
  2. 直接使用binding获取组件,不用再findById()
java 复制代码
  binding.button.setOnClickListener {
      binding.textView.text="Hello"
  }

binding组件原理

  • 跟入DataBindingUtil.setContentView
  • 跟入bindToAddedViews --> bind(component, childView, layoutId)-->sMapper.getDataBinder(bindingComponent, root, layoutId)
  • 此时没有设置tag,代码也会自动设置一个tag
  • 跟入private ActivityMainBindingImpl(androidx.databinding.DataBindingComponent bindingComponent, View root, Object\[\] bindings)
  • mapBindings(DataBindingComponent bindingComponent, View view,Object\[\] bindings, IncludedLayouts includes, SparseIntArray viewsWithIds,boolean isRoot) 递归获取组件,存入数组bindings
  • 使用父抽象类的初始化方法,将组件绑定在对应的变量上。返回一个绑定了组件的对象。所以可以直接使用对象 . 获取组件。
java 复制代码
  protected ActivityMainBinding(Object _bindingComponent, View _root, int _localFieldCount,
      Button button1, Button button2, LinearLayoutCompat linearLayout, ConstraintLayout main,
      TextView textView) {
    super(_bindingComponent, _root, _localFieldCount);
    this.button1 = button1;
    this.button2 = button2;
    this.linearLayout = linearLayout;
    this.main = main;
    this.textView = textView;
  }
  • 主逻辑流程图:

双向绑定

java 复制代码
android:text="@={user.pwd}"
java 复制代码
public class User extends BaseObservable {
    private String name;
    private String pwd;


    public User(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }

    @Bindable
    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(BR.name);
    }

    @Bindable
    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
        notifyPropertyChanged(BR.pwd);
    }
}

此时user和UI中的数据会自动同步更改。

同步原理

user推给UI

notifyPropertyChanged(BR.name);

UI推给user
ex:

mDirtyFlags保证只有修改的值进行推送,

  1. 初始化:
    在绑定类初始化时,mDirtyFlags 被设置为一个初始值,通常为 0,表示所有属性都是"干净"的。
  2. 设置数据:
    当数据源发生变化时,相应的位被设置为"脏"。例如,如果某个属性发生了变化,mDirtyFlags 对应的位会被置为 1。
  3. 更新视图:
    在 executeBindings 方法中,会检查 mDirtyFlags 的值,决定哪些视图需要更新。只有那些相应位被设置为"脏"的视图才会重新绑定数据。
相关推荐
沫璃染墨29 分钟前
从零入门计算机网络系列(十一):HTTP协议进阶——从重定向原理到GET/POST与Fiddler抓包
linux·服务器·开发语言·网络·c++·tcp/ip·html
拥小抱1 小时前
Compose 知识点
android
刚入门的大一新生1 小时前
Linux-线程互斥
java·开发语言
文章永久免费只为良心1 小时前
Web应用安全与防护_第三章_日志文件包含_从一道 CTFshow 题目讲透「日志投毒型 LFI → RCE」:原理、时序陷阱与全变种攻防手册
android·网络安全·渗透测试·漏洞危害·漏洞描述·日志投毒·红队指南
香芋芋圆1 小时前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
AIsoft_86891 小时前
学术讲座录音如何整理?录音APP可行吗
android·iphone
小熊恋旧2 小时前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
云边云科技_云网融合2 小时前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Evand J2 小时前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机
will_net2 小时前
apollo 站点部署&C#接入
开发语言·c#·apollo