Android中add方式加载Fragment后返回原页生命周期不触发问题
问题原因分析
add方式的Fragment生命周期特性:当你使用add()方法将Fragment B叠加到Fragment A上时,Fragment A的生命周期并不会切换到暂停状态,它始终处于RESUMED状态,仅View被上层的Fragment B遮挡。因此当Fragment B被销毁回退时,Fragment A不需要重新执行onResume()方法,自然不会有对应日志输出。onViewCreated()方法仅会在Fragment首次创建View、完成视图初始化时触发,只要Fragment A的视图没有被销毁(replace方式才会销毁前一个Fragment的视图),这个方法就不会重复执行。- 额外补充:如果你跳转时还调用了
hide(Fragment A)方法隐藏A再add B,那么回退时执行show(Fragment A)也不会触发onResume,而是会触发onHiddenChanged回调。
可行的实现方案
方案1:监听Fragment回退栈变化
在宿主HomeActivity中添加回退栈监听,判断回退后栈顶为Fragment A时,调用对应方法:
supportFragmentManager.addOnBackStackChangedListener { val topFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) if (topFragment is FragmentA) { topFragment.setLanguageSpecificData() topFragment.updateToolbar() } }
方案2:使用onHiddenChanged回调(仅适用于跳转时调用了hide(A)的场景)
在Fragment A中重写该方法:
override fun onHiddenChanged(hidden: Boolean) { super.onHiddenChanged(hidden) if (!hidden) { // 从隐藏变为显示,执行你的逻辑 Log.e("FragmentA", "重新显示") (activity as HomeActivity).updateToolbar(false) setLanguageSpecificData() } }
方案3:接口回调/事件总线
在Fragment B销毁前通过接口通知Fragment A执行逻辑,也可以使用LiveData/SharedFlow等跨组件通信工具实现事件通知。
内容的提问来源于stack exchange,提问作者Jaimin Modi
相关产品推荐
相关产品推荐

