在我们平常开发的时候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()相关推荐

  1. Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数

     Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数 时间 2014-04-19 23:05:55 CSDN博客 原文  http ...

  2. Android Fragment传递参数Fragment.setArguments(Bundle bundle)

    Fragment在Android3.0开始提供,并且在兼容包中也提供了Fragment特性的支持.Fragment的推出让我们编写和管理用户界面更快捷更方便了. 但当我们实例化自定义Fragment时 ...

  3. ViewPager动态添加、删除Fragment,且提供红色小圆球指示当前位置

    简单的说,代码要实现的是类似于现在通用新闻客户端头部的新闻图片展示.现在的新闻客户端顶部一般放有图片展示区,假设有5张图片,用户可以左右侧滑翻阅,同时提供一行5个红色小圆球(红色小圆球的个数等于图片数 ...

  4. Fragment的运用实列

    运用ListFragment view: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android ...

  5. android fragment 弹出对话框,Android DialogFragment弹框实现

    前言: 网上说了一堆好处,我只说自己深有体会的两点吧 1.屏幕横竖屏切换的时候,弹框可以保存状态 2.可以在popwindow中使用 使用步骤 1.创建继承DialogFragment的dialogF ...

  6. 低版本系统兼容的ActionBar(四)添加Tab+添加自定义的Tab视图+Fragment

    在ActionBar中添加Tab是很有用的技巧.在support V7库的支持下,我们几乎可以用和之前一样的方式来添加Tab,对于Tab来说,我们可以和MenuItem一样,给他定义自己的视图.我这里 ...

  7. Android中Fragment+ViewPager的配合使用

    原本在上一篇博客中要讲解一个Fragment的综合应用,但是中间又想到了滑屏方式,所以就分类在总结了一下,(http://smallwoniu.blog.51cto.com/3911954/13089 ...

  8. android class newinstance 构造函数 参数,android Fragment里的newInstance和构造函数

    最近用android studio创建fragment时,总是默认会创建一个静态工厂函数 public static InstalledAppFragment newInstance() { Inst ...

  9. Android-实现切换Fragment页功能

    场景:使用Fragment实现切页. 类结构: 一:Activity Activity中使用getSupportFragmentManager().beginTransaction()来填充一个Fra ...

最新文章

  1. 下一代对话系统中的关键技术(上篇)
  2. 容器学习 之 容器的概念(一)
  3. 子进程 已安装 post-installation 脚本 返回错误状态 4
  4. oracle 整个表空间迁移,oracle11g迁移表空间
  5. oracle fnd file.log,OracleEBSWIP模块DebugLog收集方法
  6. 合成资产挖矿项目 ARCx 启动流动性挖矿
  7. python怎么后撤步_你的后撤步用对了吗? | 后撤步的目的
  8. mysql amp;amp;_浅析mysql交互式连接amp;非交互式连接
  9. Spark数据分析技术学习笔记(二)——DataFrame使用
  10. 正则去除汉字和只取数字
  11. 7-4 是不是顺子 (10 分)
  12. 电子设计大赛-仪器仪表类题目分析
  13. plc编程及应用_常见进制在PLC编程中的应用,学PLC必备~
  14. php 厘米转为英寸,将cm换算为in (厘米换算为英寸)
  15. 嵌入式开发如何入门?
  16. 解决 login.live.com onedrive.live.com 等微软国外网站打不开问题
  17. 8000字干货:那些很厉害的人是怎么构建知识体系的
  18. kali wifi不可用_Kali Linux系统解决无线网卡无法连接WIFI模块教程:
  19. 线程竞争导致的EOFException解决 ---  一次线上问题解决流程
  20. python清除变量方法

热门文章

  1. MSSQLServer基础01(数据类型)
  2. Ubuntu上安装nginx步骤及问题记录
  3. 初步学习“C#枚举”
  4. 图.exe 已触发了一个断点。 出现了_学术简报︱基于保护综合重要度的最小断点集优选方法...
  5. 5.PHP与Web页面交互
  6. C#-CHTTPDownload
  7. C语言经典例100-将学生成绩写入文件
  8. 【Groovy】闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )
  9. 【C 语言】const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )
  10. 【鸿蒙 HarmonyOS】UI 组件 ( 单选按钮 | RadioButton 与 RadioContainer 组件 )