Fragment.setArguments()
在我们平常开发的时候Fragment是经常使用的,而我们创建一个Fragment对象的时候一般都会 通过 new Fragment()构造方法来实现,如果要传递参数我们一般会重载构造方法,例如 new Fragment(Parameter p)。
但是这样的做法是不被提倡的,如果你重载构造函数之后,系统会有一个warning,如下:
Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead
- 1
这个警告的意思就是,尽量避免使用 不是默认的构造函数(也就是我们重载的构造函数):通过 使用默认的构造函数 加上 Fragment.setArguments(Bundle)来取代。
接下来我们来看一下这两种方式:
重载的构造函数:
public class MyFragment extends Fragment { public MyFragment(MyParameter p){ //将参数保存起来 } }
如果在创建Fragment的时候,使用 MyFragment mf = new MyFragment(parameter)
来传递参数。
通过Fragment.setArguments(Bundle)
public class MyFragment extends Fragment { public static MyFragment newInstance(int someInt) { MyFragment myFragment = new MyFragment(); Bundle args = new Bundle(); args.putInt("someInt", someInt); myFragment.setArguments(args); return myFragment; } }
这种方式在创建Fragment的时候,使用MyFragment mf = MyFragment.newInstance(paramter)
来传递参数。
分析
乍一看这两种方法似乎没有什么本质区别,但是实际上 方法一(重载构造函数)是有一个隐患的。
根据Android文档说明,当一个fragment重新创建的时候,系统会再次调用 Fragment中的默认构造函数。 注意这里:是 默认构造函数。
这句话更直白的意思就是:当你小心翼翼的创建了一个带有重要参数的Fragment的之后,一旦由于什么原因(横竖屏切换)导致你的Fragment重新创建。——-很遗憾的告诉你,你之前传递的参数都不见了,因为recreate你的Fragment的时候,调用的是默认构造函数。
对比
而使用系统推荐的 Fragment.setArguments(Bundle)来传递参数。就可以有效的避免这一个问题,当你的Fragment销毁的时候,其中的Bundle会保存下来,当要重新创建的时候会检查Bundle是否为null,如果不为null,就会使用bundle作为参数来重新创建fragment.
疑问:
当fragment重建的时候,怎么获取之前的参数呢?
以上面的代码为例:我们可以重写 fragment的onCreate()方法。
getArguments().getInt("someInt", 0);
当fragment重现创建,调用onCreate方法,然后就可以取得之前的参数了,然后就可以尽情使用了。
bundle是如何将参数保存下来,然后重建的时候再利用呢?
这个问题可以移步这篇博客。
注意:
setArguments can only be called before the Fragment is attached to the Activity.
setArguments方法的调用必须要在Fragment与Activity关联之前。
这句话可以这样理解,setArgument方法的使用必须要在FragmentTransaction 的commit之前使用。
详见:连接。
参考资料1:
参考资料2
参考资料3
转载于:https://www.cnblogs.com/holyday/p/7505559.html
Fragment.setArguments()相关推荐
- Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数
Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数 时间 2014-04-19 23:05:55 CSDN博客 原文 http ...
- Android Fragment传递参数Fragment.setArguments(Bundle bundle)
Fragment在Android3.0开始提供,并且在兼容包中也提供了Fragment特性的支持.Fragment的推出让我们编写和管理用户界面更快捷更方便了. 但当我们实例化自定义Fragment时 ...
- ViewPager动态添加、删除Fragment,且提供红色小圆球指示当前位置
简单的说,代码要实现的是类似于现在通用新闻客户端头部的新闻图片展示.现在的新闻客户端顶部一般放有图片展示区,假设有5张图片,用户可以左右侧滑翻阅,同时提供一行5个红色小圆球(红色小圆球的个数等于图片数 ...
- Fragment的运用实列
运用ListFragment view: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android ...
- android fragment 弹出对话框,Android DialogFragment弹框实现
前言: 网上说了一堆好处,我只说自己深有体会的两点吧 1.屏幕横竖屏切换的时候,弹框可以保存状态 2.可以在popwindow中使用 使用步骤 1.创建继承DialogFragment的dialogF ...
- 低版本系统兼容的ActionBar(四)添加Tab+添加自定义的Tab视图+Fragment
在ActionBar中添加Tab是很有用的技巧.在support V7库的支持下,我们几乎可以用和之前一样的方式来添加Tab,对于Tab来说,我们可以和MenuItem一样,给他定义自己的视图.我这里 ...
- Android中Fragment+ViewPager的配合使用
原本在上一篇博客中要讲解一个Fragment的综合应用,但是中间又想到了滑屏方式,所以就分类在总结了一下,(http://smallwoniu.blog.51cto.com/3911954/13089 ...
- android class newinstance 构造函数 参数,android Fragment里的newInstance和构造函数
最近用android studio创建fragment时,总是默认会创建一个静态工厂函数 public static InstalledAppFragment newInstance() { Inst ...
- Android-实现切换Fragment页功能
场景:使用Fragment实现切页. 类结构: 一:Activity Activity中使用getSupportFragmentManager().beginTransaction()来填充一个Fra ...
最新文章
- 下一代对话系统中的关键技术(上篇)
- 容器学习 之 容器的概念(一)
- 子进程 已安装 post-installation 脚本 返回错误状态 4
- oracle 整个表空间迁移,oracle11g迁移表空间
- oracle fnd file.log,OracleEBSWIP模块DebugLog收集方法
- 合成资产挖矿项目 ARCx 启动流动性挖矿
- python怎么后撤步_你的后撤步用对了吗? | 后撤步的目的
- mysql amp;amp;_浅析mysql交互式连接amp;非交互式连接
- Spark数据分析技术学习笔记(二)——DataFrame使用
- 正则去除汉字和只取数字
- 7-4 是不是顺子 (10 分)
- 电子设计大赛-仪器仪表类题目分析
- plc编程及应用_常见进制在PLC编程中的应用,学PLC必备~
- php 厘米转为英寸,将cm换算为in (厘米换算为英寸)
- 嵌入式开发如何入门?
- 解决 login.live.com onedrive.live.com 等微软国外网站打不开问题
- 8000字干货:那些很厉害的人是怎么构建知识体系的
- kali wifi不可用_Kali Linux系统解决无线网卡无法连接WIFI模块教程:
- 线程竞争导致的EOFException解决 --- 一次线上问题解决流程
- python清除变量方法
热门文章
- MSSQLServer基础01(数据类型)
- Ubuntu上安装nginx步骤及问题记录
- 初步学习“C#枚举”
- 图.exe 已触发了一个断点。 出现了_学术简报︱基于保护综合重要度的最小断点集优选方法...
- 5.PHP与Web页面交互
- C#-CHTTPDownload
- C语言经典例100-将学生成绩写入文件
- 【Groovy】闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )
- 【C 语言】const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )
- 【鸿蒙 HarmonyOS】UI 组件 ( 单选按钮 | RadioButton 与 RadioContainer 组件 )