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
属性。
viewModel.user
访问的是LiveData<User>
,但DataBinding会检测到这个值,并处理它内部的结构。- 在实际运行时,当
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 则简化了数据和视图的绑定过程。这种组合大大提高了代码的可读性和维护性。