【问题标题】:Call a current visible NavHostFragment's method from Activity从 Activity 调用当前可见的 NavHostFragment 的方法
【发布时间】:2021-11-12 04:18:22
【问题描述】:

为了完成这个任务,我目前使用的是一个 FragmentListner 接口,但是我需要使用 create 一个静态方法来获取 Fragment 的实例。为了避免这种静态方式的方法,我正在考虑是否有更好的方法来做到这一点。我需要在 Activity 上获取当前可见的片段实例,并在此基础上调用该片段的方法。

如果它不是 NavHost 片段,我很容易得到下面这样的片段实例,并且可以从中调用任何公共方法。

    Fragment fragment = getCurrentFragment();
    if (fragment instanceof MyFragment) {
                ((MyFragment) fragment).doFragmentOperation();
      }

    private Fragment getCurrentFragment() {
       return this.getSupportFragmentManager()
            .findFragmentById(R.id.framelayout);
      }

但是我可以通过 addOnDestinationChangedLisnter 方法知道哪个片段是可见的,如下所示

navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
        @Override
        public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
          
            switch (destination.getId()) {
                case R.id.navigation_x:
                    Toast.makeText(this, "X fragment is visible", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.navigation_y:
                    Toast.makeText(this, "Y fragment is visible", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.navigation_z:
                    Toast.makeText(this, "Z fragment is visible", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    });

这里我们可以通过destination id知道可见的fragment,有什么可以直接返回给我们可见的fragment实例吗?

【问题讨论】:

    标签: android android-fragments android-activity android-fragmentactivity android-jetpack-navigation


    【解决方案1】:

    您可以使用NavHostFragment 获取primaryNavigationFragment,使用其childFragmentManager

    val navHostFragment = supportFragmentManager.findFragmentById(R.id.your_nav_host_fragment_id) as NavHostFragment
    val currentFragment = navHostFragment.childFragmentManager.primaryNavigationFragment
    

    看看这是否适合你!

    【讨论】:

    • 是的,它确实对我有用。谢谢
    【解决方案2】:

    这个问题好像有点不清楚,你用的是导航组件吗?

    如果是这样,那就太简单了:只需添加一个navController.addOnDestinationChangeListener(),您将始终知道活动中的当前Fragment

    如果没有,你可以使用findLast from supportFragmentManager:

    supportFragmentManager.fragments.findLast { fgm -> //fragment that is currently on top }
    

    【讨论】:

    • 嘿我正在使用 navController.addOnDestinationChangeListener() 但是我们可以通过目标 id 知道可见片段,有什么可以直接返回我们可见片段实例的吗?我编辑了问题,请看一下
    • 一旦你拥有它,只需询问findFragmentById(id) 就可以了。不确定返回的是什么,但我相信你至少可以将它投射到你的片段中
    • 不,它没有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2012-07-23
    • 1970-01-01
    • 2012-08-17
    相关资源
    最近更新 更多