Android 当中的 Fragment 协作解耦方式

Android 当中的 Fragment 协作解耦方式

文章目录

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

第一章 前言介绍

第01节 遇到的问题

复制代码
场景介绍:
	1、在同一个项目开发过程中, 程序员A 和 程序员B 开发着不同的功能模块。
	2、有一天需要程序员 A 和 程序员B 之间功能模块, 存在相互的调用关系。
	3、但是这些功能尚未开发完毕, 还在进行中。

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

第02节 绘图说明

问题细节介绍

问题的解决方案

第二章 核心代码

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

第01节 代理人接口

java 复制代码
// 定义中间衔接的接口
public interface IServiceA2B {

    // 处理点击姓名的操作, 传递两个参数
    void handleClickName(int position, String message);

    // 处理点击头像的操作, 没有传递参数
    void handleClickAvert();
}

第02节 中间人 Activity

java 复制代码
// 中间的 Activity 衔接人
public class Activity {

    // 在初始化 Activity 的 onCreate() 方法的时候, 初始化两个 Fragment
    private FragmentA fragmentA;
    private FragmentB fragmentB;

    public void onCreate(){
        // 初始化两个 Fragment
        fragmentA = new FragmentA();
        fragmentB = new FragmentB();

        // 两个Fragment 都会持有 Activity的对象
        fragmentA.onCreateView(this);
        fragmentB.onCreateView(this);
    }


    // 定义中间衔接的接口, 该接口采用内部类的方式实现, 便于统一管理。
    // 如果存在多个 FragmentA.FragmentB.FragmentC.FragmentD...
    // 可以分别实现不同的接口方式
    private final IServiceA2B serviceA2B = new IServiceA2B() {
        @Override
        public void handleClickName(int position, String message) {
            fragmentB.showName(position, message);
        }

        @Override
        public void handleClickAvert() {
            fragmentB.showAvert();
        }
    };

    // 暴露出接口对象, 给事件发起者, 持有该接口, 通过接口去调用具体的实现。
    public IServiceA2B getServiceA2B() {
        return serviceA2B;
    }
}

第03节 开发者A

事件的发起方。FragmentA

java 复制代码
// 总结: 对于事件的发起者, 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

java 复制代码
// 总结: 对于事件的接收者, 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节 测试类

模拟过程

java 复制代码
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退出了....
相关推荐
ii_best3 小时前
按键精灵支持安卓14、15系统,兼容64位环境开发辅助工具
android
美狐美颜sdk3 小时前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
恋猫de小郭8 小时前
Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持
android·开发语言·ios·kotlin
aqi008 小时前
FFmpeg开发笔记(七十七)Android的开源音视频剪辑框架RxFFmpeg
android·ffmpeg·音视频·流媒体
androidwork10 小时前
深入解析内存抖动:定位与修复实战(Kotlin版)
android·kotlin
梦天201510 小时前
android核心技术摘要
android
szhangbiao12 小时前
“开发板”类APP如果做屏幕适配
android
高林雨露13 小时前
RecyclerView中跳转到最后一条item并确保它在可视区域内显示
android
移动开发者1号15 小时前
ReLinker优化So库加载指南
android·kotlin
山野万里__15 小时前
C++与Java内存共享技术:跨平台与跨语言实现指南
android·java·c++·笔记