registerFragmentLifecycleCallbacks失效,如何获取当前显示的HealthExamFragment?
你遇到的核心问题是注册的是Activity级别的FragmentManager,而NavHostFragment作为顶层Fragment,内部通过自己的childFragmentManager管理导航栈里的子Fragment(比如你的HealthExamFragment),所以回调先触发到NavHostFragment,而非目标Fragment。下面给你几种可行的解决方法:
方法1:直接从NavHostFragment获取当前显示的子Fragment
先找到NavHostFragment实例,再通过它的childFragmentManager获取栈顶的目标Fragment:
// 替换成你布局中NavHostFragment的id val navHostFragment = fm.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val currentChildFragment = navHostFragment.childFragmentManager.primaryNavigationFragment // 判断是否是目标Fragment if (currentChildFragment is HealthExamFragment) { fm.unregisterFragmentLifecycleCallbacks(this) showHealthResults(item) }
方法2:给NavHost的childFragmentManager注册生命周期回调
不要注册到Activity的FragmentManager,转而注册到NavHostFragment内部的childFragmentManager,这样回调会直接触发到导航栈里的子Fragment:
if (!fm.isStateSaved) { bottomSheet.show(fm, "HealthExamResultBottomSheet") } else { // 先获取NavHostFragment实例 val navHostFragment = fm.findFragmentById(R.id.nav_host_fragment) as NavHostFragment // 注册到它的childFragmentManager navHostFragment.childFragmentManager.registerFragmentLifecycleCallbacks(object : FragmentManager.FragmentLifecycleCallbacks() { override fun onFragmentResumed(fm: FragmentManager, f: Fragment) { super.onFragmentResumed(fm, f) // 直接判断当前Fragment类型 if (f is HealthExamFragment) { fm.unregisterFragmentLifecycleCallbacks(this) showHealthResults(item) } } }, false) }
方法3:利用Navigation Controller监听目的地变化
如果你用的是Jetpack Navigation组件,也可以直接通过NavController监听当前页面的变化,更贴合导航逻辑:
val navController = findNavController(R.id.nav_host_fragment) navController.addOnDestinationChangedListener { _, destination, _ -> // 替换成你HealthExamFragment的目的地id if (destination.id == R.id.healthExamFragment) { if (!bottomSheet.isAdded) { showHealthResults(item) } // 记得在不需要时移除监听,避免内存泄漏 navController.removeOnDestinationChangedListener(this) } }
另外注意:你原代码里的if ((f = this@HealthExamFragment))是赋值操作,正确的判断应该用f === this@HealthExamFragment(判断引用是否相同)或者f is HealthExamFragment(判断类型)。
内容的提问来源于stack exchange,提问作者Flutura Demaj
相关产品推荐
相关产品推荐

