Fragment使用全解析
链接:https://www.jianshu.com/p/fd71d65f0ec6
Fragment传递数据,建议使用setArguments(Bundle args),而后在onCreate中使用getArguments()取出
show(),hide()最终是让Fragment的View setVisibility(true还是false),不会调用生命周期;
replace()的话会销毁视图,即调用onDestoryView、onCreateView等一系列生命周期
注意:如果你的app有大量图片,这时更好的方式可能是replace,配合你的图片框架在Fragment视图销毁时,回收其图片所占的内存。
- onHiddenChanged的回调时机 当使用add()+show(),hide()跳转新的Fragment时,旧的Fragment回调onHiddenChanged(),不会回调onStop()等生命周期方法,而新的Fragment在创建时是不会回调onHiddenChanged(),这点要切记。
- Fragment重叠问题 使用show(),hide(),在用24.0.0+的版本,不需要特殊处理,官方已经修复该BUG;
BackStack(回退栈)
通过 addToBackStack() 保存当前事务,当用户按下返回键时,如果回退栈中保存有之前的事务,便会执行事务回退,而不是 finish 掉当前 Activity。
如果移除Fragmnet时把这个事务加入回退栈,代码如下:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.remove(fragment);
transaction.addToBackStack(null);
transaction.commit();
Fragment实例就不会被销毁,只是视图销毁,只执行如下的生命周期方法:
onPause
->onStop
->onDestroyView
Fragment实例销毁才会执行onDetach方法,执行如下的生命周期方法:
onPause
-> onStop
-> onDestroyView
-> onDestroy
-> onDetach
Fragment还有另外一个非常神奇的设计,就是调用了setRetainInstance(true)的Fragment在Activity重创建时候不会销毁Fragment的实例,只是会销毁视图并detach,不会执行onDestroy。
**但是这种Fragment有什么用呢?
在Activity重创建期间,一些简单的数据我们可能通过onSaveInstanceState方法保存就很方便啦,但是有时候会遇见很复杂的数据,此时我们利用Fragment保留实例的这种特性,创建一个没有界面的Fragment用来保存数据是非常方便的一种做法。**
不建议使用onSaveInstanceState方法保存业务数据,首先是不一定会调用,再者就是如果保存数据量大,可能会引发TransactionTooLargeException(公司最近出现一个bug,似乎也是由于前期程序员可能没有考虑到而出站很多的bug)。对于有大量业务数据需要保存的情况,推荐使用持久化存储,或者创建空Fragment配合setRestoreState(true)的方法进行操作。