Android 当中的 Fragment 协作解耦方式

Android 当中的 Fragment 协作解耦方式

文章目录

  • Android 当中的 Fragment 协作解耦方式
    • 第一章 前言介绍
      • 第01节 遇到的问题
      • 第02节 绘图说明
    • 第二章 核心代码
      • 第01节 代理人接口
      • 第02节 中间人 Activity
      • 第03节 开发者A
      • 第04节 开发者B
      • 第05节 测试类

第一章 前言介绍

第01节 遇到的问题

场景介绍:1、在同一个项目开发过程中, 程序员A 和 程序员B 开发着不同的功能模块。2、有一天需要程序员 A 和 程序员B 之间功能模块, 存在相互的调用关系。3、但是这些功能尚未开发完毕, 还在进行中。问题来了:1、在未开发完毕之前, 如何实现相互之间能够调用呢?2、怎样才能保证功能的协作开发, 正确有效的完成呢?试想场景:1、如果程序员 A 直接创建了 程序员B 开发类的对象, 调用程序员B 的方法。2、那么假设有一天程序员B 修改了其功能和操作, 那么程序员A 也被迫需要跟着修改。(依赖关系很强烈)



第02节 绘图说明

问题细节介绍

在这里插入图片描述


问题的解决方案

在这里插入图片描述





第二章 核心代码

为了简单直击问题点,我们采用 Java 代码去模拟 Android 的一些基础环境。

第01节 代理人接口

// 定义中间衔接的接口
public interface IServiceA2B {// 处理点击姓名的操作, 传递两个参数void handleClickName(int position, String message);// 处理点击头像的操作, 没有传递参数void handleClickAvert();
}



第02节 中间人 Activity

// 中间的 Activity 衔接人
public class Activity {// 在初始化 Activity 的 onCreate() 方法的时候, 初始化两个 Fragmentprivate FragmentA fragmentA;private FragmentB fragmentB;public void onCreate(){// 初始化两个 FragmentfragmentA = new FragmentA();fragmentB = new FragmentB();// 两个Fragment 都会持有 Activity的对象fragmentA.onCreateView(this);fragmentB.onCreateView(this);}// 定义中间衔接的接口, 该接口采用内部类的方式实现, 便于统一管理。// 如果存在多个 FragmentA.FragmentB.FragmentC.FragmentD...// 可以分别实现不同的接口方式private final IServiceA2B serviceA2B = new IServiceA2B() {@Overridepublic void handleClickName(int position, String message) {fragmentB.showName(position, message);}@Overridepublic void handleClickAvert() {fragmentB.showAvert();}};// 暴露出接口对象, 给事件发起者, 持有该接口, 通过接口去调用具体的实现。public IServiceA2B getServiceA2B() {return serviceA2B;}
}



第03节 开发者A

事件的发起方。FragmentA


// 总结: 对于事件的发起者, FragmentA 需要做的三件事情:
// 1. 通过 Fragment 拿到 Activity 的对象。
// 2. 通过 Activity 的对象, 拿到代理接口的对象 service
// 3. 在处理点击事件的时候, 采用代理接口的对象, 去调用具体的方法
public class FragmentA {private Activity activity;public void onCreateView(Activity activity){System.out.println("FragmentA.onCreateView");this.activity = activity;buttonClickAvert();buttonClickName(66, "张无忌");}private void buttonClickName(int position, String name) {System.out.println("FragmentA.buttonClickName");activity.getServiceA2B().handleClickName(position, name);}private void buttonClickAvert() {System.out.println("FragmentA.buttonClickAvert");activity.getServiceA2B().handleClickAvert();}
}



第04节 开发者B

事件的接收方。FragmentB

// 总结: 对于事件的接收者, FragmentB 需要做的三件事情:
// 1. 自己的 Fragment 当中, 去定义接收到数据之后的实现展示的逻辑
// 2. 在外部定义需要衔接的接口, 代理接口 IServiceXXX
// 3. 在Activity 当中, 去定义接口的内部类实现。
//      I.  接口实现的方法当中, 采用 FragmentB 的对象, 去调用 FragmentB 当中的方法
//      II. 对外暴露出代理接口的对象, 也就是快捷键生产 getIServiceXXX 的对象, 让发送者持有代理接口对象。
public class FragmentB {private Activity activity;public void onCreateView(Activity activity){System.out.println("FragmentB.onCreateView");this.activity = activity;}public void showAvert() {System.out.println("FragmentB.showAvert");}public void showName(int position, String name) {System.out.println("FragmentB.showName.position: " + position +", name: " + name);}}



第05节 测试类

模拟过程

public class Main {public static void main(String[] args) {System.out.println("APP启动了...");Activity activity = new Activity();activity.onCreate();System.out.println("APP退出了....");}
}

最终运行的结果

APP启动了...
FragmentA.onCreateView
FragmentA.buttonClickAvert
FragmentB.showAvert
FragmentA.buttonClickName
FragmentB.showName.position: 66, name: 张无忌
FragmentB.onCreateView
APP退出了....






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

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

相关文章

使用 React Flow 构建一个思维导图应用

思维导图是围绕共同主题或问题将思想、概念、信息或任务分组的视觉表示。思维导图应用是一种软件应用,允许您创建、可视化和组织您的思想、想法和信息作为思维导图。本文将向您展示如何实现自己的思维导图应用程序。 在我们开始之前,我想向您展示一下我们…

JAXB的XmlElement注解

依赖 如果基于JAX-WS开发&#xff0c;可以在maven工程的pom.xml文件中增加如下依赖&#xff0c;会将依赖的JAXB库也下载下来&#xff1a; <dependency><groupId>jakarta.xml.ws</groupId><artifactId>jakarta.xml.ws-api</artifactId><vers…

Android 屏幕适配

目录 一、为什么要适配 二、几个重要的概念 2.1 屏幕尺寸 2.2 屏幕分辨率 2.3 屏幕像素密度 2.4 屏幕尺寸、分辨率、像素密度三者关系 三、常用单位 3.1 密度无关像素(dp) 3.2 独立比例像素&#xff08;sp&#xff09; 3.3 dp与px的转换 四、解决方案 4.1 今日头条…

在QGIS中加载显示3DTiles数据

“我们最近有机会在QGIS 3.34中实现一个非常令人兴奋的功能–能够以“Cesium 3D Tiles”格式加载和查看3D内容&#xff01;” ——QGIS官方的 宣传介绍。 体验一下&#xff0c;感觉就是如芒刺背、如坐针毡、如鲠在喉。 除非我电脑硬件有问题&#xff0c;要么QGIS的3Dtiles是真…

Springboot更新用户头像

人们通常(为徒省事)把一个包含了修改后userName的完整userInfo对象传给后端&#xff0c;做完整更新。但仔细想想&#xff0c;这种做法感觉有点二&#xff0c;而且浪费带宽。 于是patch诞生&#xff0c;只传一个userName到指定资源去&#xff0c;表示该请求是一个局部更新&#…

wpf devexpress Property Gird管理集合属性

Property Grid允许你添加&#xff0c;浏览和编辑集合属性

B站批量取消关注

找到关注页面&#xff1a; 右键检查或者按F12进入开发者界面 然后选console&#xff0c;在页面下面输入下面jQuery代码&#xff0c;然后按回车。复制粘贴两次这一页的博主就能全部取消大概20个 然后刷新页面&#xff0c;接着粘贴两边代码&#xff0c;循环如此即可。 $(".…

浙大恩特客户资源管理系统CustomerAction.entphone;.js 接口任意文件上传漏洞复现 [附POC]

文章目录 浙大恩特客户资源管理系统CustomerAction.entphone;.js 接口任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 浙大恩特客户资源管理系统CustomerAction.entphone;.js 接口任…

K8S1.23.5部署(此前1.17版本步骤囊括)及问题记录

应版本需求&#xff0c;升级容器版本为1.23.5 kubernetes组件 一个kubernetes集群主要由控制节点&#xff08;master&#xff09;与工作节点&#xff08;node&#xff09;组成&#xff0c;每个节点上需要安装不同的组件。 master控制节点&#xff1a;负责整个集群的管理。 …

qt 重载信号,使用““方式进行connect()调用解决方案

问题 在Qt中&#xff0c;重载的信号默认是无法使用&这种方式调用的。 因为&只能绑定到一个具体的信号&#xff0c;而重载的信号名称相同&#xff0c;编译器无法确定要绑定哪一个信号。 解决方案 如果非要使用&绑定重载的信号&#xff0c;可以使用函数指针进行转…

Vue 路由缓存 防止路由切换数据丢失

在切换路由的时候&#xff0c;如果写好了一丢数据在去切换路由在回到写好的数据的路由去将会丢失&#xff0c;这时可以使用路由缓存技术进行保存&#xff0c;这样两个界面来回换数据也不会丢失 在 < router-view >展示的内容都不会被销毁&#xff0c;路由来回切换数据也…

贪吃蛇游戏

package com.snake.controller;import javax.swing.JFrame; import javax.swing.JOptionPane;import com.snake.view.SnakeJPanel;public class SnakeStart {public static void main(String[] args) {int speed 0;String showInputDialog null;//初始化时间//得到速度while(…