Android 开发 ViewModel、LiveData、DataBinding 的一个联合使用

原文链接https://www.shanya.world/archives/266bf90b.html

ViewModel可以将数据模块进行单独的管理,可以使我的控制器更加的简单,只需要专注于控制界面的逻辑和用户的操作。另外当我们的Activity被Destroy或者重新Create时数据不会丢失。(例如切换系统语言、屏幕旋转)其配合LiveData可以对数据的改变进行监听。然后通过DataBingding将数据与控件进行绑定,减少像按键响应等代码的数量。

这里我将一个篮球赛计分的例子来记录ViewModel、LivaData、DataBinding的用法

首先新建一个 MyViewModel 继承于 ViewModel。

package com.shanya.score;

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

public class MyViewModel extends ViewModel {
    private MutableLiveData aTeamScore; //a队的分数
    private MutableLiveData bTeamScore; //b队的分数
    private int aBack,bBack; //用于Undo操作的上一次各队分数

    //普通的Get方法
    public MutableLiveData getaTeamScore() {
        if (aTeamScore == null){ //处理空指针异常
            aTeamScore = new MutableLiveData<>();
            aTeamScore.setValue(0);
        }
        return aTeamScore;
    }

    public MutableLiveData getbTeamScore() {
        if (bTeamScore == null){
            bTeamScore = new MutableLiveData<>();
            bTeamScore.setValue(0);
        }
        return bTeamScore;
    }

    //加分操作,该方法通过DataBinding与按键绑定
    public void aTeamAdd(int p){
        aBack = aTeamScore.getValue();
        bBack = bTeamScore.getValue();
        aTeamScore.setValue(aTeamScore.getValue() + p);
    }

    public void bTeamAdd(int p){
        aBack = aTeamScore.getValue();
        bBack = bTeamScore.getValue();
        bTeamScore.setValue(bTeamScore.getValue() + p);
    }

    //重置操作
    public void reset(){
        aBack = aTeamScore.getValue();
        bBack = bTeamScore.getValue();
        aTeamScore.setValue(0);
        bTeamScore.setValue(0);
    }
    //撤销操作
    public void undo(){
        aTeamScore.setValue(aBack);
        bTeamScore.setValue(bBack);
    }
}

接下来就说一说DataBinding是怎么与控件进行绑定的。

首先,我们需在app目录下的build.gradle里面打开DataBinding


在这里插入图片描述

之后打开我们的布局文件,切换到Text页面
光标放在图中的位置并点击灯泡图标


在这里插入图片描述

选择第一个


在这里插入图片描述

之后在 中间加一个变量,这里直接贴出我的xml文件



    
        
    

    

        

        

        

        

        

        

        

        

        

        

        

        

        

之后就是MainActivity里面的操作了

package com.shanya.score;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;

import android.database.DatabaseUtils;
import android.os.Bundle;

import com.shanya.score.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {
    MyViewModel myViewModel;
    ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);//相当于上面注释的那一条语句
        myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);//创建MyViewModel实例
        binding.setData(myViewModel);
        binding.setLifecycleOwner(this);
    }
}

可以发现以前的各种控件代码都不见了。代码更加的精简。

Demo源码下载地址GitHub 或者 CSDN

你可能感兴趣的:(Android 开发 ViewModel、LiveData、DataBinding 的一个联合使用)