前言

我们使用Activity的时候,可以通过startActivityForResult来启动一个新的Activity,然后在新的Activity中可以用setResult来向前一个Activity回传一些结果信息,前一个Activity会在onActivityResult中得到这个信息。

那么当我们使用Fragment的形式来作为页面的时候呢?我们知道可以使用setArguments向后面的Fragment传递信息,但是如何回传结果信息?

setTargetFragment

Android提供了一种方式setTargetFragment

public void setTargetFragment(Fragment fragment, int requestCode)

将前一个Fragment设置给后面的Fragment,然后就可以通过getTargetFragment()getTargetRequestCode()来获取对应的Fragment和Code。

当我们需要回传信息的时候,就可以调用onActivityResult即可,如下:

getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intentData);

这样前一个Fragment就可以在它的onActivityResult处理这些回传信息。

上面可以发现其实就是将前一个Fragment对象交给后面的Fragment持有而已,我们自己创建一个set函数其实也可以实现,但是还是推荐使用Android提供的setTargetFragment,来看看它的源码:

/*** Optional target for this fragment.  This may be used, for example,* if this fragment is being started by another, and when done wants to* give a result back to the first.  The target set here is retained* across instances via {@link FragmentManager#putFragment* FragmentManager.putFragment()}.** @param fragment The fragment that is the target of this one.* @param requestCode Optional request code, for convenience if you* are going to call back with {@link #onActivityResult(int, int, Intent)}.*/
public void setTargetFragment(Fragment fragment, int requestCode) {// Don't allow a caller to set a target fragment in another FragmentManager,// but there's a snag: people do set target fragments before fragments get added.// We'll have the FragmentManager check that for validity when we move// the fragments to a valid state.final FragmentManager mine = getFragmentManager();final FragmentManager theirs = fragment != null ? fragment.getFragmentManager() : null;if (mine != null && theirs != null && mine != theirs) {throw new IllegalArgumentException("Fragment " + fragment+ " must share the same FragmentManager to be set as a target fragment");}// Don't let someone create a cycle.for (Fragment check = fragment; check != null; check = check.getTargetFragment()) {if (check == this) {throw new IllegalArgumentException("Setting " + fragment + " as the target of "+ this + " would create a target cycle");}}mTarget = fragment;mTargetRequestCode = requestCode;
}/*** Return the target fragment set by {@link #setTargetFragment}.*/
final public Fragment getTargetFragment() {return mTarget;
}/*** Return the target request code set by {@link #setTargetFragment}.*/
final public int getTargetRequestCode() {return mTargetRequestCode;
}

可以看到setTargetFragment会先进行两轮校验,首先保证前后两个Fragment是同样的FragmentManager,然后保证TargetFragment和当前Fragment不是同一个,所以setTargetFragment会更安全,而且Android已经提供了这套方式,我们就没必要自己再实现了。

如何向前一个Fragment回传信息?相关推荐

  1. 【Android Developers Training】 20. 创建一个Fragment

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. linux用户在哪个文件夹,LINUX中用命令成功建立一个用户后信息会记录在哪个文件中...

    LINUX中用命令成功建立一个用户后信息会记录在哪个文件中 发布时间:2007-07-28 10:14:57来源:红联作者:MPiops 增加用户帐号后 新建用户的命令十分简单,在命令行下使用 use ...

  3. Android笔记:Fragment与Activity之间的交互,onAttach,退出最后一个 fragment

    一.交互代码笔记: 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     private Log ...

  4. python日历小程序_一个查看网络设备信息Python小程序

    原标题:一个查看网络设备信息Python小程序 网络编程中,最常见的一个问题就是,获取设备信息. 首先我们,要学习如何获取本机的网络信息.我们将用到标准库中的socket库.假如说,我们要查看本机的 ...

  5. 以下结点node定义了一个学生的信息。函数find查找并返回学号小于num,且下一节点学号不小于num的结点指针

    以下结点node定义了一个学生的信息.函数find查找并返回学号小于num,且下一节点学号不小于num的结点指针.函数insert按学号递增顺序插入新学生.测试主函数从键盘输入5个学号,调用inser ...

  6. Android之解决viewpage加载第3个fragment的时候,第一个fragment又重新构建问题

    1 .问题 viewpage加载第3个fragment的时候,第一个fragment又重新构建问题,感觉自己好傻逼的,不知道啥原因,原来是少了一个设置,加载旁边多少个fragment不销毁 2 .解决 ...

  7. python自动填写小程序表单_新年好!教大家用Python写一个自动回复拜年信息的小程序!...

    原标题:新年好!教大家用Python写一个自动回复拜年信息的小程序! 过年期间,想必大家都收到很多拜年信息吧!有没有也被拜年短信(大部分是群发)搞得很焦虑?不回复似乎显得很没有礼貌,一一回复又累心劳神 ...

  8. 在微信小程序中怎么让一个页面的信息传递到另一个页面

    首先需要在前台搭建好需要展示的那个页面. <!--pages/login/login.wxml--> <view class='nav'>输入个人信息</view> ...

  9. 自动关闭当前的Fragment返回上一个Fragment该如何实现

    场景: 当我们在当前的fragment完成事件后,需要让他自动返回上一个fragment. 原文:https://blog.csdn.net/zhuangshiwenbin/article/detai ...

最新文章

  1. android exchange服务,带有“ Service com.android.exchange.ExchangeService
  2. Django-admin管理工具
  3. Hazelcast集群服务(2)——Hazelcast基本配置
  4. VScode前端开发常用插件
  5. n1怎么进入线刷模式_怎么用斐讯NI天天链刷机成电视机顶盒教程
  6. MDT2012+ADK8.0+WDS部署Windows客户端(一)部署概念和方法论
  7. 液压机行业研究及十四五规划分析报告
  8. 传统方法车道线标注及相关知识
  9. 开放平台-web实现人人网第三方登录
  10. IntelliJ IDEA 文件只读
  11. 逆向爬虫19 Scrapy增量式和分布式
  12. android串口开发!一年后斩获腾讯T3,附面试题答案
  13. intellIj idea修改英文字体解决大写的“I”和小写的“l”显示冲突问题
  14. ApacheCN 计算机视觉译文集 20211110 更新
  15. 定积分的计算与辛普森积分及龙贝格积分
  16. NFT Insider #87:The Sandbox 收购游戏开发工作室 Sviper,GHST 大迁徙即将拉开帷幕
  17. 程序员一定会有35岁危机吗?三分天注定,七分靠打拼
  18. 最小二乘法的C语言实现
  19. 蓝牙 - 设备类型设置: Class of Device
  20. 用Aspera批量下载数据

热门文章

  1. LabVIEW(七):多态VI
  2. Js取float型小数点后两位数的方法
  3. 谁是谁的first-child
  4. C++ Primer学习随笔(一)
  5. sql server获取表的所有字段
  6. 移动端 | table 布局
  7. Object之defineProperty
  8. FTP服务器搭建下的主动模式和被动模式
  9. Linux如何在线修改hostname
  10. 使用python的docker-py实现docker的api操作