如何向前一个Fragment回传信息?
前言
我们使用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回传信息?相关推荐
- 【Android Developers Training】 20. 创建一个Fragment
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- linux用户在哪个文件夹,LINUX中用命令成功建立一个用户后信息会记录在哪个文件中...
LINUX中用命令成功建立一个用户后信息会记录在哪个文件中 发布时间:2007-07-28 10:14:57来源:红联作者:MPiops 增加用户帐号后 新建用户的命令十分简单,在命令行下使用 use ...
- 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 ...
- python日历小程序_一个查看网络设备信息Python小程序
原标题:一个查看网络设备信息Python小程序 网络编程中,最常见的一个问题就是,获取设备信息. 首先我们,要学习如何获取本机的网络信息.我们将用到标准库中的socket库.假如说,我们要查看本机的 ...
- 以下结点node定义了一个学生的信息。函数find查找并返回学号小于num,且下一节点学号不小于num的结点指针
以下结点node定义了一个学生的信息.函数find查找并返回学号小于num,且下一节点学号不小于num的结点指针.函数insert按学号递增顺序插入新学生.测试主函数从键盘输入5个学号,调用inser ...
- Android之解决viewpage加载第3个fragment的时候,第一个fragment又重新构建问题
1 .问题 viewpage加载第3个fragment的时候,第一个fragment又重新构建问题,感觉自己好傻逼的,不知道啥原因,原来是少了一个设置,加载旁边多少个fragment不销毁 2 .解决 ...
- python自动填写小程序表单_新年好!教大家用Python写一个自动回复拜年信息的小程序!...
原标题:新年好!教大家用Python写一个自动回复拜年信息的小程序! 过年期间,想必大家都收到很多拜年信息吧!有没有也被拜年短信(大部分是群发)搞得很焦虑?不回复似乎显得很没有礼貌,一一回复又累心劳神 ...
- 在微信小程序中怎么让一个页面的信息传递到另一个页面
首先需要在前台搭建好需要展示的那个页面. <!--pages/login/login.wxml--> <view class='nav'>输入个人信息</view> ...
- 自动关闭当前的Fragment返回上一个Fragment该如何实现
场景: 当我们在当前的fragment完成事件后,需要让他自动返回上一个fragment. 原文:https://blog.csdn.net/zhuangshiwenbin/article/detai ...
最新文章
- android exchange服务,带有“ Service com.android.exchange.ExchangeService
- Django-admin管理工具
- Hazelcast集群服务(2)——Hazelcast基本配置
- VScode前端开发常用插件
- n1怎么进入线刷模式_怎么用斐讯NI天天链刷机成电视机顶盒教程
- MDT2012+ADK8.0+WDS部署Windows客户端(一)部署概念和方法论
- 液压机行业研究及十四五规划分析报告
- 传统方法车道线标注及相关知识
- 开放平台-web实现人人网第三方登录
- IntelliJ IDEA 文件只读
- 逆向爬虫19 Scrapy增量式和分布式
- android串口开发!一年后斩获腾讯T3,附面试题答案
- intellIj idea修改英文字体解决大写的“I”和小写的“l”显示冲突问题
- ApacheCN 计算机视觉译文集 20211110 更新
- 定积分的计算与辛普森积分及龙贝格积分
- NFT Insider #87:The Sandbox 收购游戏开发工作室 Sviper,GHST 大迁徙即将拉开帷幕
- 程序员一定会有35岁危机吗?三分天注定,七分靠打拼
- 最小二乘法的C语言实现
- 蓝牙 - 设备类型设置: Class of Device
- 用Aspera批量下载数据