Android MVC 写法

前言

Model:负责数据逻辑

View:负责视图逻辑

Controller:负责业务逻辑

持有关系:

1、View 持有 Controller

2、Controller 持有 Model

3、Model 持有 View

辅助工具:ViewBinding

执行流程:View  ==> Controller ==> Model ==> View

案例效果图:

1、定义Controller接口

/*** 控制器接口 负责业务逻辑*/
public interface IController extends IBaseController {void setModel(IModel model); // 持有model/*** 这些都是方法,都是由 View 调用的*/void onDataChanged(String data); // 监听输入文本事件,通知 Modelvoid submitFrom(); // 提交表单事件,通知 Modelvoid clearData(); // 清空按钮点击事件,通知 Model}

1.1、实现Controller接口

/*** 业务逻辑 具体实现*/
public class IControllerImp implements IController {private IModel model;@Overridepublic void setModel(IModel model) {this.model = model;}@Overridepublic void removeHandlerMsgAndCallback() {model.removeHandlerMsgAndCallback();}@Overridepublic void onDataChanged(String data) {model.onDataChanged(data);}@Overridepublic void submitFrom() {model.submitFromData();}@Overridepublic void clearData() {model.clearData();}
}

2、定义Model接口

/*** 数据模型接口 负责数据逻辑*/
public interface IModel extends IBaseModel {void setView(IView view); // 持有View/*** 这些都是方法,都是由 Controller 调用的*/void onDataChanged(String data); // 监听文本变化,时时更新数据后,通知 Viewvoid submitFromData(); // 提交表单数据后,通知 Viewvoid clearData(); // 清空数据后,通知 View}

2.1、实现Model接口

/*** 数据模型逻辑 具体实现*/
public class IModelImp implements IModel {private String mData = "";private Handler handler = new Handler();private IView iview;@Overridepublic void setView(IView view) {this.iview = view;}@Overridepublic void removeHandlerMsgAndCallback() {handler.removeCallbacksAndMessages(null);}@Overridepublic void onDataChanged(String data) {mData = data;iview.onDataChangedUpdateText(data);}@Overridepublic void submitFromData() {iview.showSubmitFromLoading(mData);handler.removeCallbacksAndMessages(null);handler.postDelayed(new Runnable() {@Overridepublic void run() {iview.hideSubmitFromLoading();}}, 1500);}@Overridepublic void clearData() {mData = "";iview.clearFromData();}
}

3、定义View接口

/*** 视图接口 负责视图逻辑*/
public interface IView extends IBaseView {default void setController(IController controller) {} // 持有控制器,根据View事件,通知 Controller/*** 这些都是方法,都是由 Model 调用的*/void onDataChangedUpdateText(String data); // 根据时时数据更新TextViewvoid showSubmitFromLoading(String data); // 显示loadingvoid hideSubmitFromLoading(); // 隐藏loadingvoid clearFromData(); // 清空EditText数据}

3.1、实现View接口

/*** 视图逻辑 具体实现*/
public class MVCActivity extends AppCompatActivity implements IView,View.OnClickListener {private IModel iModel; // 数据层 Mprivate IController iController; // 控制器层 Cprivate AlertDialog dialog;private ActivityMvcBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMvcBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());iModel = new IModelImp();iController = new IControllerImp();// 注意一下,写的顺序iModel.setView(this); // 持有ViewiController.setModel(iModel); // 持有ModelsetController(iController); // 持有控制器init();}@Overridepublic void onClick(View v) {if (v == binding.submitBtn) {iController.submitFrom();} else if (v == binding.clearBtn) {iController.clearData();}}@Overrideprotected void onDestroy() {super.onDestroy();iController.removeHandlerMsgAndCallback();}private void init() {binding.editMsg.setText("normal");binding.edit.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {iController.onDataChanged(s.toString());}@Overridepublic void afterTextChanged(Editable s) {}});binding.submitBtn.setOnClickListener(this);binding.clearBtn.setOnClickListener(this);}@Overridepublic void onDataChangedUpdateText(String data) {binding.editMsg.setText(data);}@Overridepublic void showSubmitFromLoading(String data) {AlertDialog.Builder builder = new AlertDialog.Builder(this);TextView textView = new TextView(this);if (TextUtils.isEmpty(data)) {data = "normal";}textView.setText("正在提交:" + data);builder.setCancelable(false);builder.setView(textView);dialog = builder.show();}@Overridepublic void hideSubmitFromLoading() {dialog.dismiss();}@Overridepublic void clearFromData() {binding.edit.setText("");binding.editMsg.setText("normal");}
}

4、IBaseController

/*** Base 控制器接口 负责业务逻辑*/
public interface IBaseController {// 写一些,公用或者通用的方法,用于扩展default void removeHandlerMsgAndCallback() {} // 删除handler 回调和消息}

5、IBaseModel

/*** Base 数据模型接口 负责数据逻辑*/
public interface IBaseModel {// 写一些,公用或者通用的方法,用于扩展default void removeHandlerMsgAndCallback() {} // 删除handler 回调和消息}

6、IBaseView

/*** Base 视图接口 负责视图逻辑*/
public interface IBaseView {// 写一些,公用或者通用的方法,用于扩展default void testBaseView() {}}

7、activity_mvc.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".ui.activity.MVCActivity"><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="48dp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"android:background="@color/material_dynamic_primary90"app:title="MVC" /><EditTextandroid:id="@+id/edit"android:layout_width="match_parent"android:layout_height="50dp"android:layout_marginHorizontal="16dp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@id/toolbar" /><TextViewandroid:id="@+id/edit_msg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="8dp"app:layout_constraintLeft_toLeftOf="@id/edit"app:layout_constraintTop_toBottomOf="@id/edit" /><androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/submit_btn"android:layout_width="match_parent"android:layout_height="58dp"android:layout_marginHorizontal="16dp"android:layout_marginTop="8dp"android:text="submit"android:textAllCaps="false"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@id/edit_msg" /><androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/clear_btn"android:layout_width="match_parent"android:layout_height="58dp"android:layout_marginHorizontal="16dp"android:layout_marginTop="8dp"android:text="clear"android:textAllCaps="false"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@id/submit_btn" /></androidx.constraintlayout.widget.ConstraintLayout>

8、源码地址

GitHub - LanSeLianMa/AndroidMVC: Android MVC 写法

9、其他写法

Android MVP 写法-CSDN博客

Android MVVM 写法-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu22.04系统安装软件、显卡驱动、cuda、cudnn、pytorch

Ubuntu22.04系统安装软件、显卡驱动、cuda、cudnn、pytorch 安装 Nvidia 显卡驱动安装 CUDA安装 cuDNN安装 VSCode安装 Anaconda 并更换源在虚拟环境中安装 GPU 版本的 PyTorchReference 这篇博文主要介绍的是 Ubuntu22.04 系统中软件、显卡驱动、cuda、cudnn、pytorch 等软件和…

STM32CubeMX教程8 TIM 通用定时器 - 输出比较

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.1、外设初始化函数调用流程 3.2.2、外设中断函数调用流程 3.2.3、添加其他必要代码 4、常用函数 5…

轮廓检测与处理

轮廓检测 先将图像转换成二值 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图 ret, thresh cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 变为二值&#xff0c;大于127置为255&#xff0c;小于100置为0.使用cv2.findContours(thresh, cv2.RETR_TREE, cv2.…

jvm实战之-常用jvm命令的使用

各命令的使用 JMAP 1、查看内存信息&#xff0c;对象实例数、对象占有大小 jmap -histo 进程号>./log.txt2、查看堆的配置信息和使用情况 jmap - heap 进程号3、将堆的快照信息dump下来&#xff0c;使用java自带的jvisualvm.exe打开分析 jmap -dump:formatb,filedump.h…

Elasticsearch:升级索引以使用 ELSER 最新的模型

在此 notebook 中&#xff0c;我们将看到有关如何使用 Reindex API 将索引升级到 ELSER 模型 .elser_model_2 的示例。 注意&#xff1a;或者&#xff0c;你也可以通过 update_by_query 来更新索引以使用 ELSER。 在本笔记本中&#xff0c;我们将看到使用 Reindex API 的示例。…

二叉树之堆的应用

目录 堆排序 思路详解 Ⅰ 建堆 Ⅱ 利用堆的删除思想来进行排序 功能接口 向上调整算法 向下调整算法 主函数 运行结果展示 TOP - K问题 思路详解 Ⅰ 用数据集合中前K个元素来建堆 Ⅱ 用剩余的N-K个元素依次与堆顶元素来比较&#xff0c;不满足则替换堆顶元素 功…

算法刷题:最大异或对(Trie树扩展)、食物链(并查集扩展)

目录 引言一、最大异或对&#xff08;Trie树扩展&#xff09;1.题目描述2.解题思路3.代码实现4.测试 二、食物链&#xff08;并查集扩展&#xff09;1.题目描述2.解题思路3.代码实现4.测试 引言 这两个扩展题能够让我们更加的熟悉Trie树和并查集的使用&#xff0c;这两道题可以…

MySQL:子查询

子查询 子查询是嵌套在较大查询中的 SQL 查询&#xff0c;也称内部查询或内部选择&#xff0c;包含子查询的语句也称为外部查询或外部选择。简单来说&#xff0c;子查询就是指将一个 select 查询&#xff08;子查询&#xff09;的结果作为另一个 SQL 语句&#xff08;主查询&a…

Leetcode的AC指南 —— 哈希法/双指针:15. 三数之和

摘要&#xff1a; Leetcode的AC指南 —— 15. 三数之和。题目介绍&#xff1a;给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且…

Android—— MIPI屏调试

一、实现步骤 1、在kernel/arch/arm/boot/dts/lcd-box.dtsi文件中打开&dsi0节点&#xff0c;关闭其他显示面板接口&#xff08;&edp_panel、&lvds_panel&#xff09; --- a/kernel/arch/arm/boot/dts/lcd-box.dtsib/kernel/arch/arm/boot/dts/lcd-box.dtsi-5,14 …

水库大坝安全监测设计与施工经验

随着我国的科技水平不断上升&#xff0c;带动了我国的水电建设向更高层次发展。目前&#xff0c;我国的水电站大坝已有上百座&#xff0c;并且大坝安全检测仪器质量与先进技术不断更新发展&#xff0c;如今水电站大坝数据信息采集与观测资料分析&#xff0c;能够有效提高水库大…

Linux系统安装MySQL

Linux系统安装MySQL 第一步&#xff1a;下载YUM wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm第二步&#xff1a;安装MySQL的YUM 仓库 rpm -ivh mysql57-community-release-el7-11.noarch.rpm第三步&#xff1a;查看MySQL版本 yum repolist …

ESP32:整合存储配网信息和MQTT笔记

文章目录 1.给LED和KEY的所用IO增加配置项1.1 增加配置文件1.2 修改相应的c源码 2. 把mqtt\tcp的工程整合到一起2.1 在何处调用 mqtt_app_start() 3. 测试MQTT4. 完整的工程源码 有一段时间没有玩ESP32&#xff0c;很多知识点都忘记了。今天测试一下MQTT&#xff0c;做个笔记。…

基于ssm的4S店预约保养系统开发+vue论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

如何成功拿下uniapp生命周期?

uniapp介绍 Uniapp作为一款跨平台应用开发框架&#xff0c;具有两个生命周期&#xff1a; 组件生命周期页面生命周期什么是页面&#xff1f; pages下面的.vue或者.nvue&#xff08;app端&#xff09;文件就是页面 什么是组件&#xff1f; 一般通常会把项目中的组件放在com…

web前端开发html/css求职简介/个人简介小白网页设计

效果图展示&#xff1a; html界面展示&#xff1a; html/css代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.…

驶入未来:网约车运营数据揭秘与可视化大屏展示

驶入未来&#xff1a;网约车运营数据揭秘与可视化大屏展示 引言1. 数据获取与准备1.1 数据来源1.2 数据结构 2. 数据处理模块2.1 数据清洗2.2 数据转换2.3 数据整合 3. 数据可视化大屏4. 创新性可视化展示5. 应用与决策支持 结语 引言 数字化时代下&#xff0c;网约车运营数据…

轮滑培训机构会员系统,轮滑俱乐部会员卡管理软件教程

轮滑培训机构会员系统&#xff0c;轮滑俱乐部会员卡管理软件教程 一、软件程序问答 1、轮滑会员管理&#xff0c;那么会员卡是否可以直接用手机号呢&#xff1f; 如下图&#xff0c;软件以 佳易王轮滑会员管理系统V16.2为例说明 会员在登记的时候&#xff0c;会员卡可以直…

python实现图像的二维傅里叶变换——冈萨雷斯数字图像处理

原理 二维傅里叶变换是一种在图像处理中常用的数学工具&#xff0c;它将图像从空间域&#xff08;我们通常看到的像素排列&#xff09;转换到频率域。这种变换揭示了图像的频率成分&#xff0c;有助于进行各种图像分析和处理&#xff0c;如滤波、图像增强、边缘检测等。 在数学…

按摩上门预约小程序源码系统 开发组合:PHP+MySQL 附带完整的搭建教程

现代生活节奏的加快&#xff0c;人们越来越注重健康与放松。按摩作为传统的舒缓方式&#xff0c;市场需求逐年上升。然而&#xff0c;传统的按摩服务预约方式较为繁琐&#xff0c;用户需拨打热线电话或前往实体店进行预约&#xff0c;这无疑增加了用户的操作成本。因此&#xf…