Android开发之add方式添加Fragment生命周期不响应
根因:
当使用add()
方法添加FragmentB时,FragmentA未触发onPause()
和onStop()
是预期行为,原因如下:
Fragment叠加机制
add()
会将FragmentB叠加在FragmentA之上,而非替换。此时FragmentA仍保持可见状态(仅被覆盖),因此不会进入暂停或停止生命周期阶段。只有完全不可见的Fragment才会触发onStop()
回调。生命周期状态保留
通过addToBackStack()
将事务加入回退栈后,系统会保留FragmentA的视图和状态。此时FragmentA被视为部分可见组件,其生命周期仅会触发onHiddenChanged(false)
而非完整暂停流程。与
replace()
的差异
若需销毁FragmentA并触发完整生命周期,应改用replace()
方法。此时会依次调用onPause()
→onStop()
→onDestroyView()
,但会重建视图导致状态丢失
看下代码解决方案,将下面的代码添加到Activity中
private fun bindFragment(targetTag: String, block: () -> Fragment) {val fragmentManager = supportFragmentManagerval topFragment = getTopFragment(fragmentManager)LogUtils.w("当前栈顶fragment:${topFragment?.javaClass?.simpleName}")// 先尝试回退到目标Fragmentval popped = fragmentManager.popBackStackImmediate(targetTag, 0)if (!popped) {fragmentManager.beginTransaction()//手动隐藏当前的fragment,让其相应onHiddenChanged生命周期.hide(topFragment!!).add(R.id.login_fragment_container, block(), targetTag)//手动调用onShow让其新添加的fragment强制显示执行onHiddenChanged生命周期方法.show(block()).addToBackStack(targetTag).commit()}}//拿到当前显示的fragmentfun getTopFragment(fragmentManager: FragmentManager): Fragment? {return if (fragmentManager.backStackEntryCount > 0) {val tag = fragmentManager.getBackStackEntryAt(fragmentManager.backStackEntryCount - 1).namefragmentManager.findFragmentByTag(tag)} else {fragmentManager.fragments.lastOrNull()}}
然后在add的fragment中重写onHiddenChanged方法即可监听当前和add的fragment的显示隐藏状态了!