Вызовите текущий видимый метод NavHostFragment из действия

#android #android-fragments #android-activity #android-fragmentactivity #android-jetpack-navigation

Вопрос:

Для выполнения этой задачи я в настоящее время использую интерфейс FragmentListner, но мне нужно использовать метод create a static, чтобы получить экземпляр фрагмента. Чтобы избежать такого подхода статического способа, я думаю, есть ли какой-нибудь лучший способ сделать это. Мне нужно получить текущий экземпляр видимого фрагмента в действии, и на основе этого мне нужно вызвать метод этого фрагмента.

Если это не фрагмент 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;
            }
        }
    });
 

Здесь мы можем узнать видимый фрагмент по идентификатору назначения, есть ли что-нибудь, что может вернуть нам экземпляр видимого фрагмента напрямую??

Ответ №1:

Вы можете использовать NavHostFragment его, чтобы получить primaryNavigationFragment childFragmentManager его с помощью .

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

Посмотрите, сработает ли это для вас!

Комментарии:

1. Да, это действительно сработало для меня. Спасибо

Ответ №2:

Вопрос кажется немного неясным, используете ли вы навигационные компоненты?

Если это так, то это слишком просто: просто добавьте navController.addOnDestinationChangeListener() , и вы всегда будете знать текущую Fragment активность.

Если нет, вы можете использовать findLast из supportFragmentManager :

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

Комментарии:

1. Эй, я использую NavController.addOnDestinationChangeListener (), но там мы можем узнать видимый фрагмент по идентификатору назначения, есть ли что-нибудь, что может вернуть нам экземпляр видимого фрагмента напрямую?? Я отредактировал вопрос, пожалуйста, посмотрите

2. как только вы его получите, просто попросите findFragmentById(id) , и все будет в порядке. Не уверен, что это вернет, но я уверен, что вы можете, по крайней мере, применить это к своему фрагменту

3. Нет, это не сработало