• Activity版本MVVM入门


    Activity 版本MVVM入门







    第一章 代码结构

    第01节 代码结构截图

    在这里插入图片描述



    第02节 结构说明

    1. 模块级别的 build.gradle 需要加入  mvvm 的 gradle
    2. 需要创建一个 Java类, 作为 ViewModel, 这个类的要求是 需要继承 androidx.lifecycle.ViewModel
    3. 修改布局文件 activity_main.xml 将其修改成为mvvm的结构
    4. 在 MainActivity 当中, 初始化 MVVM 模式的代码
    
    • 1
    • 2
    • 3
    • 4





    第二章 代码详解

    第01步 添加gradle

    代码

    buildFeatures {
        viewBinding true
    }
    
    dataBinding {
        enabled true
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    说明

    1、位置说明:

    ​ 存在于 app 模块级别的 gradle 里面,需要放在 android{ … } 当中

    2、原因说明:

    ​ 只有引入了当前的内容,后续的 MainActivity 当中才能自动创建具体的 Binding 类型



    第02步 创建ViewModel类

    代码

    import android.util.Log;
    
    import androidx.lifecycle.ViewModel;
    
    public class DemoViewModel extends ViewModel {
    
        private static final String TAG = DemoViewModel.class.getSimpleName();
    
        // 增加了一个方法, 用于 布局当中的事件处理方案
        // 在布局当中采用属性, 绑定事件  android:onClick = "@{()->viewModel.show()}"
        public void show() {
            Log.i(TAG, "Hello This is My First Activity type MVVM");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    说明

    1、注意问题:

    ​ 这里的 ViewModel 需要继承的是 androidx.lifecycle.ViewModel 这个类

    2、方法说明:

    ​ 这里的 show( ) 方法是后期为了给 控件 TextView 增加的点击事件处理。



    第03步 布局文件修改

    代码

    
    <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>
    
            <import type="svip.chc.DemoViewModel" />
    
            <variable
                name="viewModel"
                type="DemoViewModel" />
        data>
    
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MainActivity">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="@{()->viewModel.show()}"
                android:text="Hello World!"
                android:textSize="60sp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
    
        androidx.constraintlayout.widget.ConstraintLayout>
    layout>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    说明

    1、结构说明

    
    
    ​				<根布局>
    
    ​				
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2、事件处理

    ​ 对于事件处理的方式存在多种写法,这里不做一一列举。

    ​ 目前采用的写法格式是 android:onclick="@{()->viewModel.show()}"

    ​ 在事件处理当中的 viewModel 是上面 标签当中定义的 name 属性值



    第04步 Activity 的改造

    代码

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.lifecycle.ViewModelProvider;
    
    import android.os.Bundle;
    
    import svip.chc.databinding.ActivityMainBinding;
    
    public class MainActivity extends AppCompatActivity {
    
        // 这里的 ViewModel 是一个 Java 类的对象名称, 需要在 onCreate() 等方法当中, 进行初始化
        private DemoViewModel viewModel;
        // 这里的 ActivityMainBinding 是一个自动生成的类对象, 他是我们在 gradle 当中, 配置 android{...} 内部两个标签后生成的
        private ActivityMainBinding binding;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // 如果采用的是 MVVM 的方式, 就不要直接采用下面的方式去设置布局了。
            // setContentView(R.layout.activity_main);
            // ------------------------------
            // 我们需要给上面的两个成员变量进行初始化, 在初始化的过程中, 设置布局方式和事件监听
            // 1. 初始化 binding 对象
            binding = ActivityMainBinding.inflate(getLayoutInflater());
            // 2. 设置布局的方式
            setContentView(binding.getRoot());
            // 3. 初始化 viewModel 对象
            viewModel = new ViewModelProvider(this).get(DemoViewModel.class);
            // 4. 通过 binding 对象, 绑定 ViewModel
            binding.setViewModel(viewModel);
            // 5. 设置生命周期的所有者, 让事件监听能够生效
            binding.setLifecycleOwner(this);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    说明

    1、布局整改

    ​ 将原始的设置布局的方式,需要修改成为 setContentView(binding.getRoot());

    2、对于成员变量需要定义两个

    ​ 他们分别是 bindingviewModel

    ​ 两个成员变量都要完成初始化的过程,以及初始化完毕之后的,绑定过程。

    3、需要注意的两件事情:

    ​ 第一件事情: binding 的类型是自动生成的,他是在我们 appgralde 当中添加两段代码之后,才能自动生成

    ​ 第二讲事情: 如果没有设置生命周期的所有者,点击事件的监听会失效





    第三章 效果展示

    第01节 显示效果

    在这里插入图片描述



    第02节 点击处理

    在这里插入图片描述









  • 相关阅读:
    【C#语言入门】14. 字段,属性,索引器,常量
    【深入浅出Java并发编程指南】「原理分析篇」360度全方位的教你认识网络IO模型
    【技术分享】OSPFv3基本原理
    PMP模拟题 | 每日一练,快速提分
    TCP三次握手和四次挥手
    Python数据采集与处理之网页爬取
    rocketmq集群搭建笔记
    Dynamics 365 重写自带按钮
    [算法1-排序](.NET源码学习)& LINQ & Lambda
    IVX低代码平台——小程序微信红包的应用的做法
  • 原文地址:https://blog.csdn.net/ShiShiLunHui/article/details/126151209