fragment通信的几种方式(接口框架)

全新的Fragment通信方式 前言 就在前段时间,Google 推出了 Fragment Result API 和 Activity Results API,用来取代之前的 Activity 和 Fragment 之间通信方式的不足,大家可以前往看看都有那些更新: https://medium.com/androiddevelopers/now-in-android-17-9d73f7bed7f 通过Fragment Result API进行Fragment间数据传递: 发送数据 @Override @NonNull public fi 阅读详情

fragment通信是我们经常遇到问题,各种解决方案都有。
首先明确的重要点:谷歌官方建议两个fragment不要直接通信,会造成碎片耦合。
方案一:handler方案
就是通过handler发送消息,

  • activity向fragment传递消息
    activity响应事件,发送msg,到fragment中,而fragment中用来接收msg,所以用注册Handler对象,activity中发送msg的对象与fragment中handler对象必须为同一个(handler,msgqueen和looper相互唯一绑定),所以要在activity中暴露pubilic方法让fragment的acttch周期中传递handler。部分代码如下:

activity的响应事件发送msg:

tvMain.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //如果是activity相应事件,发送msg
                if(handler == null){
                    return;
                }
                Message message = new Message();
                Bundle bundle = new Bundle();
                bundle.putString("hehe","我是activity发送的msg");
                message.setData(bundle);
                handler.sendMessage(message);
            }
        });

activity中暴露的setHandler方法:

 //activity暴露方法来给fragment来设置
    public void setHandler(Handler handler){
        this.handler = handler;
    }

fragment中传递handler:

@Override
    public void onAttach(Context context) {
        super.onAttach(context);
        MainActivity activity = (MainActivity) getActivity();
        activity.setHandler(mHandler);
    }

fragment注册handler用来接收msg:

 private Handler mHandler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            Bundle bundle = msg.getData();
            strHandler = bundle.getString("hehe");
            textView.setText(strHandler+TwoFragment.class.getName());
        }
    };

这里写图片描述

  • fragment向activity传递消息
    反过来就行了,跟上面一样,不多讲了。
    缺点了:
    Fragment对具体的Activity存在耦合,不利于Fragment复用
    不利于维护,若想删除相应的Activity,Fragment也得改动
    没法获取Activity的返回数据,需要双向通信才行

方案二,利用广播的方式

上面是activity向fragment传递,这里用广播方式由fragment向activity传递数据。
在fragment中发送广播,在activity中注册广播接收者,并作出相应逻辑。

在fragment中发送广播信息

 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送广播
                Intent intent = new Intent();
                intent.setAction("co.daggertest.fragment.ThreeFragment");
                intent.putExtra("heihei","fragment发送广播");
                //使用的本地广播,用于单个app内通信,性能和安全性好点
                LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent);
            }
        });

在activity中注册广播:

         //注册本地广播接收者
        myBroadcast = new MyBroadcast();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("co.daggertest.fragment.ThreeFragment");
        LocalBroadcastManager.getInstance(this).registerReceiver(myBroadcast,intentFilter);
    内部类创建实例
 class MyBroadcast extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            heihei = intent.getStringExtra("heihei");
            tvMain.setText(heihei+MainActivity.class.getName());

        }
    }

在activity的onDestory中注销广播:

 @Override
    protected void onDestroy() {
        super.onDestroy();
        LocalBroadcastManager.getInstance(this).unregisterReceiver(myBroadcast);
    }

动态注册的广播一定要注意注销。
这里写图片描述

* 方案三、使用EventBus3.0通信*
EventBus是一款针对Android优化的发布/订阅事件总线。简化了应用程序内各组件间、组件与后台线程间的通信。

(EventBus不熟悉的可以看下这位大牛的博客:
Android事件总线(一)EventBus3.0用法全解析)
第三方库肯定首先需要依赖库:

在app下的build.gradle的dependencies下

compile 'org.greenrobot:eventbus:3.1.1'

在activity中注册EventBus来接收

 @Override
    protected void onResume() {
        super.onResume();
        //在onResume中注册,在可交互状态下占用更少内存
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        EventBus.getDefault().unregister(this);
    }

在fragment中响应事件发送msg

 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               //利用EventBus发送
                EventBus.getDefault().post("我是Four用EventBus传递的数据");
            }
        });

在activity接收事件

@Subscribe(threadMode = ThreadMode.MAIN)
    public void getFragmentMsg(String msg){
        tvMain.setText(msg+MainActivity.class.getName());
    }

这里写图片描述

方案四,使用接口’
直接上代码,在fragment中创建接口,activity实现接口中方法,完成回调和参数传递。

创建接口:

 public interface FourMainActivity{
        void changerSomething(String msg);
    }

绑定activity:


    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        fourMainActivity = (FourMainActivity) context;
    }

设置监听回调:

 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fourMainActivity.changerSomething("我是通过接口传递到MainActivity中");
            }
        });

activity实现接口:

public class MainActivity extends AppCompatActivity implements FourFragment.FourMainActivity

实现接口方法:

@Override
    public void changerSomething(String msg) {
        tvMain.setText(msg);
    }

这里写图片描述

方案五:万能的接口框架

上次看了动能学院的公开课,里面讲到的方案。设计一个接口基类Function,抽象接口。每个Function实例都有对于的名字,用于区分多个fragment的接口,而接口主要有以下几种形式:

  1. 有参数无返回值 addFunction(FunctionWithParamNoResult)
  2. 无参数无返回值 addFunction(FunctionNoParamNoResult)
  3. 有参数有返回值 addFunction(FunctionWithParamWithResult)
  4. 无参数有返回值 addFunction(FunctionNoParamWithResult)

    基类Function:

public abstract class Function {

    public String mFunctionName;


    /**
     * 构造方法
     * @param functionName  接口的名字,必须实现
     */
    public Function(String functionName) {
        this.mFunctionName = functionName;
    }
}

没有参数没有返回值接口:FunctionNoParamNoResault

public abstract class FunctionNoParamNoResault extends Function {
    /**
     * 构造方法
     *
     * @param functionName 接口的名字,必须实现
     */
    public FunctionNoParamNoResault(String functionName) {
        super(functionName);
    }

    /**
     * 无参数
     */
    public abstract  void  function();
}

没有参数带有返回值接口:FunctionNoParamWithResault

public abstract class FunctionNoParamWithResault<Result> extends Function {
    /**
     * 构造方法
     *
     * @param functionName 接口的名字,必须实现
     */
    public FunctionNoParamWithResault(String functionName) {
        super(functionName);
    }

    /**
     * 无参数,带有返回值
     * Result  泛型
     */
    public abstract  Result  function();
}

有参数带有返回值:FunctionWithParamWithResault

public abstract class FunctionWithParamWithResault<Param , Result> extends Function {
    /**
     * 构造方法
     *
     * @param functionName 接口的名字,必须实现
     */
    public FunctionWithParamWithResault(String functionName) {
        super(functionName);
    }

    /**
     * 有参数,带有返回值
     */
    public abstract  Result  function(Param data);
}

有参数无返回值的:FunctionWithParamNoResault

public abstract class FunctionWithParamNoResault<Param> extends Function {
    /**
     * 构造方法
     *
     * @param functionName 接口的名字,必须实现
     */
    public FunctionWithParamNoResault(String functionName) {
        super(functionName);
    }

    /**
     * 有参数,无返回值
     */
    public abstract  void   function(Param data);
}

管理类FunctionManager:

public class FunctionManager {

    private static FunctionManager instance;
    private HashMap<String, FunctionNoParamNoResault> mFunctionNoParamNoResault;
    private HashMap<String, FunctionNoParamWithResault> mFunctionNoParamWithResault;
    private HashMap<String, FunctionWithParamNoResault> mFunctionWithParamNoResault;
    private HashMap<String, FunctionWithParamWithResault> mFunctionWithParamWithResault;


    public FunctionManager() {
        mFunctionNoParamNoResault = new HashMap<>();
        mFunctionNoParamWithResault = new HashMap<>();
        mFunctionWithParamNoResault = new HashMap<>();
        mFunctionWithParamWithResault = new HashMap<>();
    }

    public static FunctionManager getInstance(){
        if(instance == null){
            instance = new FunctionManager();
        }
        return instance;
    }

    /**
     * 管理类添加  无参无返 
     * @param function
     * @return 链式调用返回本身
     */
    public FunctionManager addFunction(FunctionNoParamNoResault function){
        mFunctionNoParamNoResault.put(function.mFunctionName,function);
        return this;
    }

    /**
     * 管理类调用  无参无返 
     * @param name
     */
    public void invokeFunc(String name){
        if(TextUtils.isEmpty(name)){
            return;
        }

        if(mFunctionNoParamNoResault != null){
            FunctionNoParamNoResault fNPNR = mFunctionNoParamNoResault.get(name);
            if(fNPNR != null){
                fNPNR.function();
            }
            if(fNPNR == null){
                try {
                    throw  new FunctionException("Has no this function" + name);
                } catch (FunctionException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    /**
     * 管理类添加  无参有返 
     * @param function
     * @return 链式调用返回本身
     */
    public FunctionManager addFunction(FunctionNoParamWithResault function){
        mFunctionNoParamWithResault.put(function.mFunctionName,function);
        return this;
    }

    /**
     * 管理类调用 无参有返 
     * @param name 接口名字
     * @param clz   万能对象
     * @param <Result> 参数类型
     * @return 返回类型
     */
    public <Result> Result invokeFunc(String name,Class<Result> clz){
        if(TextUtils.isEmpty(name)){
            return null;
        }
        if(mFunctionNoParamWithResault != null){
            FunctionNoParamWithResault fNPWR = mFunctionNoParamWithResault.get(name);
            if(fNPWR != null){
                if(clz != null){
                    return clz.cast(fNPWR.function());
                }else {
                    return (Result) fNPWR.function();
                }
            }else {
                try {
                    throw  new FunctionException("Has no this function" + name);
                } catch (FunctionException e) {
                    e.printStackTrace();
                }
            }

        }
        return null;
    }


    /**
     * 管理类 添加有参有返 
     * @param function 实例
     * @return 链式调用
     */
    public FunctionManager addFunction(FunctionWithParamWithResault function){
        mFunctionWithParamWithResault.put(function.mFunctionName,function);
        return this;
    }

    /**
     * 管理类调用 有参有返 
     * @param name 接口名字
     * @param clz   万能对象
     * @param <Result> 参数类型
     * @return 返回类型
     */
    public <Result,Param> Result invokeFunc(String name, Class<Result> clz, Param data){
        if(TextUtils.isEmpty(name)){
            return null;
        }
        if(mFunctionWithParamWithResault != null){
            FunctionWithParamWithResault fWPWR = mFunctionWithParamWithResault.get(name);
            if(fWPWR != null){
                if(clz != null){
                    return clz.cast(fWPWR.function(data));
                }else {
                    return (Result) fWPWR.function(data);
                }
            }else {
                try {
                    throw  new FunctionException("Has no this function" + name);
                } catch (FunctionException e) {
                    e.printStackTrace();
                }
            }

        }
        return null;
    }

    /**
     * 管理类 添加有参无返 
     * @param function
     * @return
     */
    public FunctionManager addFunction(FunctionWithParamNoResault function){
        mFunctionWithParamNoResault.put(function.mFunctionName,function);
        return this;
    }

    /**
     * 管理类调用 有参无返 
     * @param name 名字
     * @param data 参数
     * @param <Param> 泛型
     */
    public <Param> void invokeFunc(String name, Param data){
        if(TextUtils.isEmpty(name)){
            return;
        }
        if(mFunctionWithParamWithResault != null){
            FunctionWithParamWithResault fWPWR = mFunctionWithParamWithResault.get(name);
            if(fWPWR != null){
                fWPWR.function(data);
            }else {
                try {
                    throw  new FunctionException("Has no this function" + name);
                } catch (FunctionException e) {
                    e.printStackTrace();
                }
            }

        }

    }


}

这里写图片描述
原理如上图一样,具体看下面实现代码:
BaseFragment提取公共类:

public class BaseFragment extends Fragment {


    protected FunctionManager mFunctionManager;
    private MainActivity mBaseActivity;

    /**
     * 为要实现接口的Fragment添加FunctionManager
     * @param functionManager
     */
    public void setmFunctionManager(FunctionManager functionManager){
        this.mFunctionManager = functionManager;
    }

    /**
     * 确保Mainctivity实现了Fragment相应的接口回调
     * @param context
     */
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if(context instanceof MainActivity){
            mBaseActivity = (MainActivity) context;
           mBaseActivity.setFunctionForFragment(getId());
        }
    }

}

MainActivity中往HashMap中添加对应的实例
这里用有参有返FunctionWithParamWithResault为例子

/**
     * 添加接口并实现接口方法的回调
     * @param id  Fragment的标记
     */
    public void setFunctionForFragment(int id){
        FragmentManager fm = getSupportFragmentManager();
        BaseFragment fragment = (BaseFragment) fm.findFragmentById(id);
        FunctionManager functionManager = FunctionManager.getInstance();
        fragment.setmFunctionManager(functionManager.addFunction(new FunctionWithParamWithResault<String, String>(ThreeFragment.INTERFACE_PARAM_RESULT) {

            @Override
            public String function(String data) {
                Toast.makeText(MainActivity.this,data,Toast.LENGTH_SHORT).show();
                //data为fragment传过来的参数
                tvMain.setText(data);
                //返回给fragment的值
                return "activity返回的值";
            }
        }));
    }

fragment中响应事件,获取到对应的实例(注意泛型),这里是有返回值得,re即为返回值

 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               String re = FunctionManager.getInstance().invokeFunc(INTERFACE_PARAM_RESULT,String.class, "我是传递的参数");
               buttonRe.setText(re);
            }
        });

看下运行效果:
这里写图片描述

关于多参数的问题
bundle传参,通过key value方式:代码如下修改:
fragment修改如下,传递bundle就行

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               Bundle bundle = new Bundle();
               bundle.putString("str","str");
               bundle.putInt("int",1010);
               String re = FunctionManager.getInstance().invokeFunc(INTERFACE_PARAM_RESULT,String.class, bundle);
               buttonRe.setText(re);
            }
        });

activity修改如下:

public void setFunctionForFragment(int id){
        FragmentManager fm = getSupportFragmentManager();
        BaseFragment fragment = (BaseFragment) fm.findFragmentById(id);
        FunctionManager functionManager = FunctionManager.getInstance();
        fragment.setmFunctionManager(functionManager.addFunction(new FunctionWithParamWithResault<Bundle, String>(ThreeFragment.INTERFACE_PARAM_RESULT) {

            @Override
            public String function(Bundle bundle) {
                String str = bundle.getString("str");
                int anInt = bundle.getInt("int");
                Toast.makeText(MainActivity.this,"str="+str+"   int="+anInt,Toast.LENGTH_SHORT).show();
                tvMain.setText("str="+str+"   int="+anInt);
                return "activity返回的值";
            }
        }));
    }

看下运行效果:
这里写图片描述

同理,返回参数也可以设置成Bundle。

总结:

  • 如果项目中fragment不是很多话,可以用广播传递,注意广播的注销,也比较简单。
  • 最后不要使用Handler,耦合比较高,处理不好容易内存泄露,无法获取activity返回值
  • EventBus采用反射机制,造成性能上问题,无法获取activity的返回值
  • 普通接口,用于少量fragment中,性能还不错,怕扩展。
  • 万能接口,可以获取activity的返回值,原理简单,写起来有难度(不copy下)
【Android】Fragment与Activity间通信知识总结 就是在MainActivity进行动态注册时,把data通过构造方法传参的形式传给fragment,所以要对fragment类进行修改。我这里有两个碎片在MainActivity上放着,并且他们各自都有一个按钮和文本,按钮用来发送数据,文本用来接收显示数据。这样,当数据发生变化时,我们可以通过这个变量来调用对应的实现,以通知数据变化。是一个用于携带数据的键值对集合,它可以保存各种类型的数据,本身是一个实现了。接口的类,因此它可以被序列化以便在组件之间传递。方法则是在视图创建完成后调用的,使用。 阅读详情

相关推荐

Activity与Fragment之间的通信详解

当我们使用Fragment的时候会常常与其他的Fragment或者宿主Activity进行交互,今天我们就来讲讲Fragment和Activity之间如何进行通信。       一、 接口回调机制      在讲Fragment和Android通信之前,我们先看一个应用场景,现在有一个需求,在Activity中有一个Button,有个一TextView。现在业务要求是这样,点击Button,改

源码有毒的专栏 2246

19.3、Android -- Fragment 基础学习 --Fragment与Activity的通讯,传递消息

android -- 学习笔记

u013059089的博客 1152

深入解析Android中Fragment与Activity及Fragment间的通信方式(二)

首先,定义一个接口,这个接口包含一个或多个方法,这些方法就是通信时将会被调用的。首先,我们定义一个接口,该接口包含需要在通信中使用的方法。这个接口通常定义在Activity中,或者一个单独的Java类中,供不同的Fragment使用。

weixin_42298254的博客 773

盘一下 Fragment 间的五种通信方式

今年 Google I/O 上介绍了 Jetpack 近期的更新内容,其中包括 Fragment 新增的 Result API 。本文借机盘点一下 Fragment 各种常见的通信方式。 Fragment 间的通信可以借助以下几种方式实现: 1、EventBus 2、Activity(or Parent Fragment) 3、ViewModel 4、Result API 1 基于 EventBus 通信 EventBus的优缺点都很突出。优点是限制...

winskyan的专栏 4341

NXP S32K1 SPI驱动实战:从配置到DMA传输的完整流程解析

本文深入解析了NXP S32K1系列MCU的SPI驱动开发全流程。基于S32 Design Studio环境,详细阐述了从引脚配置、LPSPI模块初始化,到实现阻塞、中断及DMA三种传输模式的实战代码与配置要点。文章重点剖析了DMA传输的配置细节与性能优化,旨在帮助开发者构建高效、稳定的嵌入式SPI通信,并提供了SPI Flash驱动的综合案例。

blue42的博客 717

【毕业设计】QT实战:从零构建仿QQ通讯系统,打造你的简历亮点项目

本文为计算机专业毕业生提供了一份详尽的毕业设计实战指南,教你如何从零开始使用QT框架构建一个仿QQ的即时通讯系统。文章深入剖析了项目规划、核心模块(登录、聊天、好友管理)的实现、TCP粘包处理、数据库设计等关键技术难点,并分享了如何将此项目打造成简历亮点,有效提升求职竞争力。

omega的博客 443

介绍一下 Fragment 间的通信方式

Fragment 间的通信方式

QG 753

从零到一:龙芯杯参赛全攻略(含北理工学长经验PDF、B站培训视频与开源代码合集)

本文详细介绍了龙芯杯全国大学生计算机系统能力大赛的参赛全攻略,包括资源整合、技能树构建、团队协作和避坑指南。提供北理工学长经验PDF、B站培训视频与开源代码合集,帮助参赛者从零基础到站上领奖台。重点解析如何高效获取优质资源、避开新手常见陷阱及构建可落地的学习路径,助力普通学生系统学习CPU设计。

weixin_26802933的博客 542

Activity 与 Fragment 之间常见的几种通信方式?

开始介绍方法之前,先借用之前lx36301766 写的答案里的一句话,我个人觉得写的很到位: 说到底就是两个普通的JAVA对象相互都持有对方的引用,直接回调就成,哪还需要什么别的通信方式,很简单的问题别搞复杂了 大家都知道java是面向对象的编程语言。只要拿到对象,想做什么操作其实很简单。好开始正文。 从两个方面开始说 Activity与Fragment通信 Fragemnt与Activit...

叫我帅阿蒙 1763

【阿里云大模型高级工程师ACP习题集】2.3 优化提示词改善答疑机器人回答质量

【摘要】这是我精心整理出对应的习题集,里面足足有 30 道题目,从基础概念到深度拓展,全方位覆盖章节重点、难点。不管你是想检验自己的学习成果,还是想针对薄弱环节进行强化训练,它都能完美适配!

davidkorhenn的博客 1630

C语言获取硬件信息(CPU序列号,硬盘序列号,网卡IP、MAC地址、是否插入网线)

本文主要介绍Linux和Windows下使用C语言获取各种硬件信息,包括CPU序列号、硬盘序列号、网卡信息(包括网卡名字、IP地址、MAC地址、网卡是否插入网线等)。

叶落花枯的博客 9379

Activity与Fragment之间通信的多种方式

前言 本文主要介绍Activity与Fragment之间通信,以及同属于一个Activity的Fragment之间的通信。主要的方式有 1、通过

qq_41818873的博客 8096

麒麟v10系统安装

麒麟v10系统安装

喜文BLOG 1万+

Android:Fragment与Activity之间的通信方式简单介绍

FragmentFragment与Activity之间的通信方式1、什么是Fragment与Activity之间的通信方式?3、Activity 如何传递数据到 Fragment?3、Fragment 如何传递数据到 Activity参考 Fragment与Activity之间的通信方式 1、什么是Fragment与Activity之间的通信方式? 常进行Android原生开发的同学都知道,Activity与Fragment之间、Fragment与Fragment之间的交互都是常规操作,是为进行开发的常规技

JMW1407的博客 7037

华为OD机试真题 新系统2026-04-01 Python&JS 实现【勇攀数字高峰】

请你在给定的数字地形图中寻找登山路径,数字代表当前位置的海拔高度,要求从最低海拔出发,不断攀登,最终到达最高山峰。你需要寻找所有满足条件的登山路径。地图已经保证最低海拔和最高山峰都只有一个。

MISAYAONE的博客 849

下采样优化实战:用ADown显著提升YOLOv11的多尺度特征保持能力

ADown 以“可编程梯度信息+多分支特征融合”打破了传统下采样的性能壁垒,为 YOLOv11 带来了多尺度特征的精准传递能力。从原理到代码集成,本教程已为你铺就了一条“小目标检测精度跃升”的实战路径。现在就动手尝试吧——当你看到模型对极小目标也能精准识别,且特征图细节完整时,你会明白这份技术探索的价值。我很乐意在你实践过程中帮你解决任何问题,让我们一起推动目标检测在下采样领域的边界。

FJN110的博客 422

Fragment学习之使用接口回调的方式实现Fragment与Activity通信

Fragment与Fragment之间可以进行信息传递,同样,Fragment与A

lavimer 7326

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Fragment之间的通信

依我所见Fragment之间的通信一般说的是 1两个同级的Fragment之间 2Fragment里面嵌套另外一个Fragment 3Fragment与FragmentActivity之间的通信

Ataraxia的专栏 5897

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Activity 与 Fragment 通信方式总结

概述 通常,Fragment 与 Activity 通信存在三种情形: Activity 操作内嵌的 Fragment Fragment 操作宿主 Activity Fragment 操作同属 Activity中的其他 Fragment 在Android中我们可以通过以下几种方式优雅地实现Activity和fragment之间的通信: Handler 广播 EventBus...

ai-exception的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android中抽象类与接口的区别?Activity与Fragment之间的通信方式有哪些?

目录抽象类与接口的区别?Activity与Fragment之间的通信方式有哪些?抽象类和接口在Java和Android开发中都是用来实现多态和代码复用的机制,但它们有一些关键的区别:定义和使用方式:继承和实现:成员变量和方法:构造器:访问速度:新方法的添加:默认实现:这些区别决定了抽象类和接口在设计类层次结构时的不同用途。抽象类更适合于存在共同行为的情况,而接口则更适合于定义一组相关功能的契约。在Android开发中,这些概念同样适用,并且经常用于设计模式和架构设计中。在Android中,Activity与

Dyan_csdn的博客 1240

Actvity和Fragment的通信及框架的使用

但是很可惜,我们发现在Activity和Fragment的使用和管理中,好像并没有见到Intent的身影,那随之而来就有一个疑问,如果在一些特殊情况下,Activity和Fragment需要进行通信或者说数据传递,该如何实现呢?相信大家在前面的课程中,已经多次的遇到过接口回调这种方式,在Android应用的原生开发中,接口回调就是最常见的一种使用方式,特别是各种控件的监听器方法,网络请求等均是通过接口回调的方式来完成的。可以在github页面查看具体的内容。具体使用方式,参见案例代码。

关注我!带你一路 "狂飙" 到底! 1292

Fragment和Activity之间的通信

Fragment和Activity之间的通信

xiaokang666的博客 3887

关于Fragment与Fragment、Activity通信的三种方式

http://www.2cto.com/kf/201511/449940.html 关于Fragment与Fragment、Activity通信的三种方式 2015-11-16     0 个评论   来源:江南一点雨的专栏   收藏  我要投稿 一直想总结一下Fragment与Fragment、Activity通信的问题,今天有时间一共总结了三种,权当抛砖引玉,如果大家还有更好的

qq_35521087的博客 323

android 使用万能接口实现Fragment之间的通信

    在google官方中已经说明坚决不要使用fragment之间直接通信的方式,目前fragment之间的通信方式很多有广播 普通接口 eventBus handler static变量,但是前段时间学习了动脑学院中讲到了万能接口,普通接口的升级版,觉得很方便 很使用,今天记录一下。  1 建立基类:     首先定义一个 abstract 的Function类,包含一个String 变量...

Mr_Isaiah的博客 590

Activity 与 Fragment通信方式-Android

Fragment 与 Activity 通信存在三种情形: Activity 操作内嵌的 Fragment Fragment 操作宿主 Activity Fragment 操作同属 Activity中的其他 Fragment Fragment 与 Activity 通信方式: Bundle 接口回调 广播 EventBus Handler ViewModel 一、Bundle 1、Activity 传递数据到 Fragment activity_main.xml <?xml ver

hequnwang10的博客 1399
上一篇: Looper、Handler、Message三者关系
下一篇: Android大喇叭---广播机制
HUandroid
博客等级 码龄10年 35粉丝 113原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值