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 的值,决定哪些视图需要更新。只有那些相应位被设置为"脏"的视图才会重新绑定数据。
相关推荐
雨白19 小时前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk19 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING20 小时前
RN容器启动优化实践
android·react native
恋猫de小郭1 天前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker1 天前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴1 天前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭2 天前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab2 天前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe2 天前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农2 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos