Fragment.setArguments()的初衷。
2015-06-16 11:26
239 查看
简介
在我们平常开发的时候Fragment是经常使用的,而我们创建一个Fragment对象的时候一般都会 通过 new Fragment()构造方法来实现,如果要传递参数我们一般会重载构造方法,例如 new Fragment(Parameter p)。但是这样的做法是不被提倡的,如果你重载构造函数之后,系统会有一个warning,如下:
[code]Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead
这个警告的意思就是,尽量避免使用 不是默认的构造函数(也就是我们重载的构造函数):通过 使用默认的构造函数 加上 Fragment.setArguments(Bundle)来取代。
接下来我们来看一下这两种方式:
重载的构造函数:
[code]public class MyFragment extends Fragment { public MyFragment(MyParameter p){ //将参数保存起来 } }
如果在创建Fragment的时候,使用
MyFragment mf = new MyFragment(parameter)
来传递参数。
通过Fragment.setArguments(Bundle)
[code]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()方法。
[code]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
相关文章推荐
- Java Dom4j操作XML
- Ubuntu14.04下如何配置固定IP
- Activity四种启动模式2
- I帧,P帧,B帧 压缩率对比
- SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
- 在WAMP中添加其它PHP版本
- [C/CPP系列知识] 在C中使用没有声明的函数时将发生什么 What happens when a function is called before its declaration in C
- VB中 MSComm控件使用详解
- oracle 基本操作练习——简单的sql语句
- Activity四种启动模式1
- Redhat下配置文件的不可见字符导致tomcat无法启动
- Git使用技巧(整理)一
- [转载]WinForm窗体间传值的方法
- C++11变长模板解析(深入理解C++11)
- java 解压缩zip 压缩zip
- 如何写一份有内涵的商业需求文档
- 屏幕尺寸、密度,分辨率查询网站(手机、平板、显示器)
- Find Peak Element——二分查找的变形
- LeetCode_33---Search in Rotated Sorted Array
- 中英文对齐,方便查询