新手困 ViewModel与Activting的databinding2个对象 区别

在Android开发中,ViewModel与Activity的Binding并不是同一个概念,它们分别指的是不同的功能和用途。

ViewModel:

ViewModel是一个为UI界面提供数据的类,它负责管理Activity或Fragment的数据。ViewModel类持有数据的引用,即使配置更改(如屏幕旋转 )发生,数据也不会丢失。ViewModel还可以帮助Activity和Fragment解耦,使得它们更容易进行单元测试。

Activity的DataBinding:

Data Binding是一个支持库,它允许你以声明方式绑定UI布局中的视图与应用程序数据源。这样可以在不使用findViewById()的情况下,将UI和数据源连接起来。

区别:

ViewModel主要用于数据持有 ,而Activity的Binding主要用于UI和数据的绑定。

解决方案和实例代码:

ViewModel的使用:

在MVVM的框架中,每一个Activity都应该对应一个ViewModel,而现在我们有一个MyActivity ,

因此可以新建一个viewmodels包,包下新建一个MyViewModel类,表示与MyActivity进行绑定。

复制代码
class MyViewModel : ViewModel() {
    private val _myLiveData = MutableLiveData<String>()
    val myLiveData: LiveData<String> get() = _myLiveData
 
    fun updateData(data: String) {
        _myLiveData.value = data
    }
}
 
class MyActivity : AppCompatActivity() {
    private lateinit var viewModel: MyViewModel
 
    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
        viewModel.myLiveData.observe(this, Observer { data ->
            // Update the UI
        })
    }
}

ViewModel是数据持久化的,因为对于一些变量就可以直接放在ViewModel当中,而不再放在Activity中,可以根据一个实际的需求来进行。

Activity的Binding使用:
复制代码
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="user"
            type="com.example.User"/>
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.email}" />
    </LinearLayout>
</layout>

注意这里要继承ViewModel, 下面先将我们的Myctivity与MyViewModel进行绑定。

复制代码
class MyActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMyBinding
 
    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_my)
        val user = User("John Doe", "johndoe@example.com")
        binding.user = user
    }
}
 
data class User(val name: String, val email: String)

在这个例子中,

ViewModel用于管理数据,

而Data Binding用于将数据绑定到UI上。

这样,Activity就不需要直接操作UI元素,数据和UI的变化可以被分离处理,提高了代码的可维护性和可测试性。

相关推荐
三少爷的鞋11 小时前
AI 时代,我们都将成为通才型开发者:只懂 Android,已经不够了
android
Dovis(誓平步青云)15 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
晚风叙码17 小时前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程17 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程20 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程21 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程1 天前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程1 天前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓1 天前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程1 天前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer