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

Android开发|关于LiveData、ViewModel、DataBinding理解和使用

1.DataBinding

databinding是安卓的一个库,允许使用xml文件将数据绑定到布局中的UI组件。启用databinding更容易的管理、更新、绑定数据到视图层

1.1启用

在build.gradle中启用

android{
  ...
  dataBinding{
      enabled=true
   }
}
1.2创建数据类
package com.example;
public class EarphoneElectric{
    private String box;
    private int elec;
    public EarphoneElectric(String box,int elec){
        this.box=box;
        this.elec=elec;
    }
    public String getBox(){
        return box;
    }
    public int getElec(){
        retrun elec;
    }
}
1.3创建xml布局文件

在布局文件中使用 <layout> 标签包裹整个布局文件,并声明变量。

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <!-- 也可以引用需要占位时候用到的工具类等 -->
                <import type="android.view.View" />
        <variable
                  name="earphoneElectric"
                  type="com.example.EarphoneElectric"/>
        <variable
            name="mTipMsg"
            type="java.lang.String" />
    </data>
</layout>
1.4在Activity或者Fragment中绑定数据
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import com.example.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Use DataBindingUtil to set the content view instend of the setContentView()
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        // Create a new object
        EarphoneElectric elc = new EarphoneElectric("boxname", 30);

        // Set the user variable in the layout
        binding.setEarphoneElectric(elc);
    }
}

2.结合使用LiveData、ViewModel、DataBinding

结合使用可以帮助实现数据和UI分离,提高代码的可维护性和响应性

2.1添加必要依赖

databinding需要启用

dependencies {
    def lifecycle_version = "2.5.0"
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    // Data Binding 库已经包含在 AndroidX 中,无需额外添加
}
2.2创建数据类
package com.example;

public class User {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
2.3创建ViewModel类

使用LiveData持有数据

package com.example;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class UserViewModel extends ViewModel {
 // 私有的 MutableLiveData 实例,用于内部数据管理
    private MutableLiveData<User> _user = new MutableLiveData<>();
    
    // 公共的 LiveData,用于暴露给外部观察 
    public LiveData<User> user = _user;

    public UserViewModel() {
        // default
        _user.setValue(new User("boxname", 30));
    }

    public LiveData<User> getUser() {
        return _user;
    }

    public void updateUser() {
        // 更新User的数据
        User updatedUser = new User("Alice", 25);
        _user.setValue(updatedUser);
    }

    public void setUser(User user) {
        _user.setValue(user);
    }
}

2.4创建布局文件

使用DataBinding和LiveData绑定UI和数据

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="viewModel"
            type="com.example.UserViewModel" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/username"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewModel.user.name}" />

        <TextView
            android:id="@+id/age"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(viewModel.user.age)}" />

        <Button
            android:id="@+id/updateButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="@{() -> viewModel.updateUser()}"
            android:text="Update User" />

    </RelativeLayout>
</layout>

在MVVM架构中,通常会在XML布局文件里直接绑定ViewModel的数据。这使得界面更新与数据变化之间的耦合度较低,从而提高代码的可维护性和测试能力。

DataBinding会自动处理LiveData的转换。即通过viewModel.user获取值时,DataBinding机制会自动获取LiveData中的值 (User对象),并进一步访问它的name属性。

  1. viewModel.user访问的是LiveData<User>,但DataBinding会检测到这个值,并处理它内部的结构。
  2. 在实际运行时,当LiveData<User>更新时,TextView会自动更新android:text绑定的数据。
2.5绑定ViewModel到Activity或者Fragment
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.activity.viewModels;
import androidx.lifecycle.ViewModelProvider;
import com.example.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Use DataBindingUtil to set the content view
        ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        // Get ViewModel
        UserViewModel viewModel = new ViewModelProvider(this).get(UserViewModel.class);

        // Bind ViewModel to layout
        binding.setViewModel(viewModel);
        binding.setLifecycleOwner(this);
        /**把当前的activity或者fragment作为lifecycleOwner传给binding对象
        --->为了让databinding了解当前Activity或者fragment的生命周期
        --->从而可以在生命周期变化时候更新数据
        --->设置这个参数后,当LiveData的值发生变化时,它能通知绑定UI自动更新
        **/    
    }
}

ViewModel 持有应用的数据并且在数据变化时更新视图,而 LiveData 用来观察数据变化,Data Binding 则简化了数据和视图的绑定过程。这种组合大大提高了代码的可读性和维护性。


http://www.kler.cn/a/394878.html

相关文章:

  • Ubuntu20.04 交叉编译Qt5.15.15 for rk3588
  • Redis-十大数据类型
  • H3C MPLS跨域optionB
  • DX12 快速教程(2) —— 渲染天蓝色窗口
  • WPS工具栏灰色怎么办
  • SDMTSP:黑翅鸢算法(Black-winged kite algorithm,BKA)求解单仓库多旅行商问题,可以更改数据集和起点(MATLAB代码)
  • UI架构解说
  • 智能量化交易的多样化策略与风险控制:中阳模型的应用与发展
  • 项目中用户数据获取遇到bug
  • 计算机课程管理:Spring Boot与工程认证的协同创新
  • Docker部署青龙面板,实现京东自动签到刷京东,提供脚本
  • 如何利用静态住宅IP提升TikTok营销效果:应对平台限制与账号安全的新利器
  • 理解HTTP中的Cookie与Session:机制、安全性与报头响应
  • 华为路由策略配置
  • SSL 证书申请以及配置流程
  • MySQL中,使用XtraBackup进行备份锁
  • Matlab2022b安装MinGW64
  • Windows仿macOS?看这一篇就够了
  • go语言 分布式一致
  • 知识库管理系统:企业数字化转型的加速器
  • 大模型研究报告 | 2024年中国金融大模型产业发展洞察报告|附34页PDF文件下载
  • Kubernetes 上部署 ZenTao(禅道)
  • 深入探究 JavaScript 中的继承方式
  • WSL2安装Ubuntu22.04并开启GPU进行ML学习教程
  • Java NIO 深度解析:构建高效的 I/O 操作
  • WEB3.0介绍