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)的方法进行操作。

results matching ""

    No results matching ""