美文网首页mvvm
ViewModel+LiveData+DataBinding

ViewModel+LiveData+DataBinding

作者: GaoXiaoGao | 来源:发表于2021-01-05 11:16 被阅读0次

ViewModel+LiveData+DataBinding综合使用
实现点击按钮后,数值加 1 并显示在屏幕上

1.创建ViewModel

项目中有一个MainActivity.java类
创建一个MainViewModel继承自ViewModel

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

public class MainViewModel extends ViewModel {

    //LiveData维护一个整型数 Number
    private MutableLiveData<Integer> Number;
    public MutableLiveData<Integer> getNumber() {

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

    /**
     * 实现数据加1
     * @param num
     */
    public void add(int num){
        Number.setValue(Number.getValue()+num);
    }
}

2.配置DataBinding

在app build.gradle中配置 DataBinding

 buildFeatures{
        dataBinding = true
        // for view binding :
        // viewBinding = true
    }

3.修改MainActivity布局文件

使用<layout> </layout>包裹整个布局 <layout>下面添加 <data></data>

<?xml version="1.0" encoding="utf-8"?>
<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>
    </data>

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.501"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.247" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.43" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

重新编译后,在MainActivity.java中可以访问一个对象ActivityMainBinding,这个对象是根据
MainActivity.java的布局文件 activity_main.xml 名字 + Binding生成的。

在MainActivity中定义 ActivityMainBinding binding;
原来的 setContentView(R.layout.activity_main); 使用
binding = DataBindingUtil.setContentView(this, R.layout.activity_main); 代替
通过binding可以访问布局中的控件

MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.view.View;
import com.gao.databinding.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    MainViewModel mainViewModel;
    ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        //创建ViewModel对象
        mainViewModel = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()).create(MainViewModel.class);
        
        //给数据Number设置观察者,数据变化后,屏幕界面更新
        mainViewModel.getNumber().observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                binding.textView.setText(String.valueOf(integer));
            }
        });

        binding.button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                mainViewModel.add(1);
            }
        });
    }
}

在<data></data>中添加 <variable/>, name是自定义ViewModel名称,type是具体的ViewModel

<data>
        <variable
            name="mainviewmodel"
            type="com.gao.databinding.MainViewModel" />
    </data>

配置好 <variable/>后TextView的数据显示可以直接绑定MainViewModel中的数据
Button的点击事件也可以直接绑定为MainViewModel中的方法

TextView

        android:text="@{String.valueOf(mainviewmodel.number)}"

Button

        android:onClick="@{()->mainviewmodel.add()}"

要让布局中控件与MainViewModel中的数据和事件绑定生效,需要在MainActivity中进行设置

 //setMainviewmodel是根据布局中绑定的自定义的ViewModel名字生成的方法
 binding.setMainviewmodel(mainViewModel);
 binding.setLifecycleOwner(this);

改造后MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import com.gao.databinding.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    MainViewModel mainViewModel;
    ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        //创建ViewModel对象
        mainViewModel = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()).create(MainViewModel.class);
        //setMainviewmodel是根据布局中绑定的自定义的ViewModel名字生成的方法
        binding.setMainviewmodel(mainViewModel);
        binding.setLifecycleOwner(this);
    }
}

参考:# LongLongLongLongLongLongLongLongLong/DataBindingDemo

相关文章

网友评论

    本文标题:ViewModel+LiveData+DataBinding

    本文链接:https://www.haomeiwen.com/subject/boddektx.html