子类化FragmentStateAdapter时为何需向父类传入参数?
关于FragmentStateAdapter必须传参的原因解析
嘿,这个问题问得特别到位!咱们把这个点掰碎了说清楚:
1. FragmentStateAdapter根本没有无参构造函数
首先得明确:FragmentStateAdapter类本身就没提供无参的构造方法。它所有可用的构造函数都要求传入一个「宿主对象」——要么是FragmentActivity,要么是Fragment。你可以看它的源码定义,核心构造签名是这样的:
public FragmentStateAdapter(@NonNull FragmentActivity fragmentActivity) { this(fragmentActivity, fragmentActivity.getLifecycle()); } public FragmentStateAdapter(@NonNull Fragment fragment) { this(fragment, fragment.getLifecycle()); }
所以你如果写FragmentStateAdapter(),编译器直接就会报错,因为找不到对应的无参构造。
2. 传入宿主是为了绑定生命周期,管理Fragment状态
FragmentStateAdapter的核心职责是管理ViewPager2里的Fragment页面,包括创建、销毁、保存/恢复状态这些操作。而这些操作必须和宿主(Activity/Fragment)的生命周期同步:
- 比如当Activity进入
onDestroy时,适配器需要及时销毁对应的Fragment,避免内存泄漏; - 当Activity配置变更(比如旋转屏幕)时,适配器需要借助宿主的生命周期来恢复之前的Fragment状态。
你传入的fa(FragmentActivity),本质是给适配器提供了一个LifecycleOwner,让它能监听宿主的生命周期事件,从而正确执行Fragment的管理逻辑。
3. 子类继承必须显式调用父类构造
在Kotlin中,子类继承父类时,必须在主构造函数中显式调用父类的一个构造方法。你的ScreenSlidePagerAdapter接收了fa参数,就是为了把这个参数传给父类的构造,满足父类对宿主对象的依赖。如果省略这个传参,编译器会因为找不到父类的无参构造而拒绝编译。
举个反例,如果你硬写无参构造的调用:
private inner class ScreenSlidePagerAdapter(fa: FragmentActivity) : FragmentStateAdapter() { // ... 实现方法 }
IDE立刻会提示错误:None of the following functions can be called with the arguments supplied:,因为父类没有无参构造可以调用。
内容的提问来源于stack exchange,提问作者Zorgan
相关产品推荐
相关产品推荐

