如何从Activity获取NavHost下当前可见Fragment实例并调用其对应方法
解决方案
你可以直接通过NavHostFragment的子Fragment管理器获取当前可见的栈顶Fragment实例,不需要依赖静态变量或者额外的接口回调,实现逻辑和你之前非NavHost场景的用法几乎一致。
1. 封装获取当前Fragment的方法
private Fragment getCurrentNavFragment() { // 此处R.id.nav_host_fragment替换为你布局文件中NavHostFragment对应的id NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment); if (navHostFragment == null) { return null; } // primaryNavigationFragment即为当前导航栈顶的可见Fragment return navHostFragment.getChildFragmentManager().getPrimaryNavigationFragment(); }
2. 调用Fragment公共方法
和你之前的使用逻辑完全一致:
Fragment currentFragment = getCurrentNavFragment(); if (currentFragment instanceof MyFragment) { ((MyFragment) currentFragment).doFragmentOperation(); }
3. 结合Destination监听使用
你也可以直接在已有的addOnDestinationChangedListener回调中直接调用该方法,拿到实例后做对应操作:
navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() { @Override public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) { Fragment currentFragment = getCurrentNavFragment(); switch (destination.getId()) { case R.id.navigation_x: if (currentFragment instanceof XFragment) { ((XFragment) currentFragment).doXOperation(); } break; case R.id.navigation_y: if (currentFragment instanceof YFragment) { ((YFragment) currentFragment).doYOperation(); } break; } } });
注意事项
- 方法中用到的
R.id.nav_host_fragment需要和你布局里声明的NavHostFragment的id保持一致 - 该方法返回的始终是当前用户可见的栈顶Fragment,无需额外维护实例状态
内容的提问来源于stack exchange,提问作者Sudhansu
相关产品推荐
相关产品推荐

