• Android数据双向绑定


    安卓的数据双向绑定类似Vue这种前端框架,只要修改模型的数据,页面上显示的数据也会跟着变化,不需要取出控件来赋值。

    一、使用databinding类

    修改配置文件build.gradle,增加配置项

    android {
        ...
        buildFeatures {
            viewBinding true
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    修改Activity类获取binding属性

    public class MainActivity extends AppCompatActivity {
    
        ActivityMainBinding binding;
        private ProgressDialog pg;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            binding = ActivityMainBinding.inflate(getLayoutInflater());
            setContentView(binding.getRoot());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    接下来就可以使用binding获取页面的元素了,页面的控件就是binding的一个属性,不再需要使用findViewById方法取得控件。

    比如:

    binding.imageview
    binding.btn
    
    • 1
    • 2

    二、双向绑定

    1、增加绑定配置

    修改配置文件build.gradle,增加两个配置项

    android {
        ...
        defaultConfig {
            ...
            dataBinding {
                enabled true
            }
        }
        ...
        buildFeatures {
            viewBinding true
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    2、修改布局文件(activity_main.xml),增加一层layout

    格式如下:
    根节点是
    节点声明了需要绑定的变量
    @{user.text}:在页面上显示模型属性
    @={user.text}:双向绑定,修改控件的值后,同步修改模型属性值

    
    <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>
            <variable
                name="user"
                type="com.nbmt.cash.BindingEntity" />
    
        data>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            tools:context=".MainActivity">
    
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="30sp"
                android:id="@+id/textView"
                android:text="@{user.text}"
                android:background="@color/purple_200"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
    
            <EditText
                android:id="@+id/edit_text"
                android:layout_width="wrap_content"
                android:layout_marginTop="20dp"
                android:textSize="30sp"
                android:layout_height="wrap_content"
                android:text="@={user.text}"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/textView" />
    
        LinearLayout>
    layout>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    3、在Activity中使用

    1)创建模型对象,必须继承基类androidx.databinding.BaseObservable

    • @Bindable:声明该属性可以用于绑定
    • 修改setXX方法,调佣notifyPropertyChanged(BR.text)发送修改通知;也可以调用notifyChange()通知所有属性
    import androidx.databinding.BaseObservable;
    import androidx.databinding.Bindable;
    
        public class BindingEntity extends BaseObservable {
        private String text;
    
        public BindingEntity(String text) {
            this.text = text;
        }
    
        @Bindable
        public String getText() {
            return text;
        }
    
        public void setText(String text) {
            this.text = text;
            notifyPropertyChanged(BR.text);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2)修改Activity,使用binding对象

    • ActivityMainBinding是框架自动生成的,和MainActivity对应
    • 使用DataBindingUtil.setContentView(this, R.layout.activity_main)获取绑定对象
    • 去掉setContentView(R.layout.activity_main)
    public class MainActivity extends AppCompatActivity {
        private ActivityMainBinding binding;
        private BindingEntity entity;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
            //setContentView(R.layout.activity_main);
            entity = new BindingEntity("我是测试数据");
            binding.setUser(entity);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    后续只要修改entity的属性值,页面控件就会自动跟着变化

  • 相关阅读:
    学习MySQL的第二天:SQL(基础篇)
    Web安全技能树-资源汇总
    vue3项目经验分享
    【Web3 系列开发教程——创建你的第一个 NFT(2)】NFT 历史回溯
    实验4 交换机端口隔离(access模式)_Cisco Packet Tracer 8.2.1
    快速查看PHP扩展的版本信息
    【k8s】ingress-nginx通过header路由到不同后端
    「数据结构」跳表原理详解及代码实现
    虹科方案|国庆出游季,古建筑振动监测让历史古迹不再受损
    Docker入门学习笔记(狂神版)
  • 原文地址:https://blog.csdn.net/wlddhj/article/details/127802487