Fragment知识点总结

141 阅读3分钟

一、FragmentManager的获取

  1. getSupportFragmentManager是FragmentActivity下的方法获取FragmentManager
  2. getParentFragmentManager是Fragment的方法,获取父类的FragmentManager,有可能是Activity也有可能是Fragment
  3. getChildFragmentManager是Fragment的方法,获取当前Fragment的FragmentManager

二、FragmentFactory

以前Fragment的构造函数不允许携带参数,因为Fragment会由系统自动创建,例如xml创建,Activity被杀死重建等。

现在可以通过给FragmentManager设置FragmentFactory,重写instantiate方法来创建Fragment,可以添加带参数的构造函数。

注意:FragmentFactory 的设置必须在 super.onCreate 之前,因为当 Activity 进入重建路径时,会在 super.onCreate 中使用到它。

三、使用FragmentContainerView作为Fragment的容器

Framelayout的子类,官方推荐使用,解决了Fragment转场动画的一些问题

四、Fragment使用Viewpager2

  • ViewPager 中使用 PagerAdaper,ViewPager2 中使用 Recyclerview.Adapter
  • ViewPager 中使用 FragmentPagerAdapter ,ViewPager2中使用 FragmentStateAdapter
  • ViewPager 中使用 FragmentStatePagerAdapter ,ViewPager2中使用 FragmentStateAdapter

实现Fragment懒加载,最新Fragment版本推荐使用setMaxLifecycle,setUserVisibleHint方法已经过期,如果使用Viewpager2,使用FragmentStateAdapter构造方法中传入BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 默认支持懒加载。

五、不同事务操作

add & remove:Fragment 状态在 INITIALIZING 与 RESUMED 之间转移;

detach & attach: Fragment 状态在 CREATE 与 RESUMED 之间转移;

replace: 先移除所有 containerId 中的实例,再 add 一个 Fragment;

show & hide: 只控制 Fragment 隐藏或显示,不会触发状态转移,也不会销毁 Fragment 视图或实例;

hide & detach & remove 的区别: hide 不会销毁视图和实例、detach 只销毁视图不销毁实例、remove 会销毁实例(自然也销毁视图)。不过,如果 remove 的时候将事务添加到回退栈,那么 Fragment 实例就不会被销毁,只会销毁视图。

六、Fragment生命周期

七、FragmentViewLifecycle

Fragment 相对于 Activity 来说比较特殊,因为其关联的 View 对象可以在单次 FragmentLifecycle 过程中先后多次加载和销毁,因此实际上 FragmentView 的生命周期和 Fragment 并不同步。

Fragment 提供了一个getViewLifecycleOwner()方法由于提供 FragmentViewLifecycle,从中可以看出该方法只能在 onCreateView()onDestroyView() 之间被调用,即只能在 FragmentView 创建了且销毁之前使用,否则将直接抛出异常。

Fragment定义五种状态

static final int INITIALIZING = 0;     初始状态,Fragment 未创建
static final int CREATED = 1;          已创建状态,Fragment 视图未创建
static final int ACTIVITY_CREATED = 2; 已视图创建状态,Fragment 不可见
static final int STARTED = 3;          可见状态,Fragment 不处于前台
static final int RESUMED = 4;          前台状态,可接受用户交互

八、Fragment返回键处理

class MyFragment : Fragment() {  
    override fun onAttach(context: Context) {    
        super.onAttach(context)    
        val callback = object : OnBackPressedCallback(true) {      
            override fun handleOnBackPressed() {        
                // Do something      
            }    
        }    
        requireActivity().onBackPressedDispatcher.addCallback(this, callback)  
    }
}

九、Fragment Result API

FragmentManager的方法:

  • setFragmentResult 方法表示的是向 requestKey 下发数据

  • setFragmentResultListener 表示的是对 requestKey 进行监听

参考资料

  1. 一文读懂 Fragment 的方方面面 - 掘金
  2. Fragment 这些 API 已废弃,你还在使用吗? - 掘金
  3. 【背上Jetpack之Fragment】你真的会用Fragment吗?Fragment常见问题以及androidx下Fragment的使用新姿势 - 掘金
  4. Androidx 下 Fragment 懒加载的新实现 - 掘金
  5. Android Jetpack 开发套件 #7 AndroidX Fragment 核心原理分析 - 掘金