Android中如何获取FragmentContainerView当前加载的Fragment实例
因为你使用的是Navigation组件的NavHostFragment作为FragmentContainerView内的根Fragment,正确获取当前显示Fragment的方式如下:
代码实现
Kotlin 版本
// 先拿到容器内的NavHostFragment实例 val navHost = supportFragmentManager.findFragmentById(R.id.fragment_container_view) as NavHostFragment // 获取当前前台展示的Fragment val currentFragment = navHost.childFragmentManager.primaryNavigationFragment
Java 版本
NavHostFragment navHost = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container_view); Fragment currentFragment = navHost.getChildFragmentManager().getPrimaryNavigationFragment();
常见问题说明
- 你之前直接用Activity的
SupportFragmentManager找不到对应Fragment,是因为NavHostFragment内部独立维护了子Fragment导航栈,必须通过它自身的childFragmentManager才能访问到栈内的Fragment实例 - 原生废弃的是Fragment类下的旧
getFragmentManager()方法,现在层级对应的API分别是:Activity用supportFragmentManager,Fragment访问自己的子Fragment用childFragmentManager,访问父级容器的FragmentManager用parentFragmentManager
可选优化
如果需要实时监听页面切换,不需要主动获取,可以给NavController注册监听器:
navHost.navController.addOnDestinationChangedListener { controller, destination, arguments -> // 匹配destination的id即可对应到导航图中注册的Fragment }
内容的提问来源于stack exchange,提问作者Foxhunt
相关产品推荐
相关产品推荐

