Различный слушатель щелчка FAB для каждого отдельного фрагмента в Навигации - PullRequest
0 голосов
/ 25 апреля 2020

При текущей реализации моего приложения я использую Навигационный компонент . В моем основном контенте у меня есть плавающая кнопка действия для всех. И в то же время у меня есть 7 различных фрагментов, которые автоматически обрабатываются контроллером навигации при необходимости перехода.

mAppBarConfiguration =
        new AppBarConfiguration.Builder( navigationDrawerFragmentIds ).setDrawerLayout( drawer ).build();
NavController navController = Navigation.findNavController( this, R.id.nav_host_fragment );

До сегодняшнего дня я использовал метод setUserVisibleHint (boolean isVisibleToUser) для переопределения другого поведения (при нажатии слушатель) для моего отдельного потрясающего в каждом отдельном фрагменте.

Как показано ниже

// FIXME: 2.11.2019 Fix deprecated methods.
@Override public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint( isVisibleToUser );
    if (isVisibleToUser && isResumed()) {
        //Only manually call onResume if fragment is already visible
        //Otherwise allow natural fragment lifecycle to call onResume
        onResume();
    } else {
        // current fragment not visible
        floatingActionButton.setOnClickListener( null );
    }
}

@Override public void onResume() {
    super.onResume();
    // FIXME: 2.11.2019 Fix deprecated methods.
    if (!getUserVisibleHint()) {
        return;
    }

    // Set listener for float action button which has been defined in main activity.
    // Here we will override the listener which can be work for our current fragment.
    floatingActionButton = getActivity().findViewById( R.id.fab );
    floatingActionButton.setOnClickListener( new View.OnClickListener() {
        @Override public void onClick(View view) {
            // do some stuff here.
        }
    } );
}

Поскольку setUserVisibleHint больше не поддерживается, я хотел заменить новое поведение вместо этого метода, как предложено в примечании к выпуску ,

Максимальный жизненный цикл: теперь вы можете установить максимальное состояние жизненного цикла для фрагмента, вызвав setMaxLifecycle () для FragmentTransaction. Это заменяет устаревший теперь setUserVisibleHint (). FragmentPagerAdapter и FragmentStatePagerAdapter имеют новый конструктор, который позволяет переключаться на новое поведение.

А также контроллер навигации по умолчанию FragmentNavigator, как я понял, но я не мог понять, эта помощь для меня, чтобы установить жизненный цикл фрагментов или поведение, как этот пост . Если я могу установить поведение, подобное упомянутому посту, тогда я в основном могу использовать onResume и onStart (я предполагаю, что это будет работать так, потому что, когда я выбираю BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT, следующий фрагмент не будет инициирован. Предполагается, что только onCreateView вызывается.)

Как я объяснил выше, я использую компонент навигации для обработки перехода между моими фрагментами. Вот почему у меня нет особого просмотра пейджера. Но я все еще могу получить информацию с помощью приведенного ниже кода, который будет обрабатывать текущий пункт назначения и обратный вызов всякий раз, когда происходит переход между фрагментами.

navController.addOnDestinationChangedListener( new NavController.OnDestinationChangedListener() {
    @Override
    public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination,
                                     @Nullable Bundle arguments) {
        Log.i( TAG, "onDestinationChanged: "  + destination.getLabel());

    }
} );

Затем в своей основной деятельности я могу установить различное поведение для моего потрясающего для каждого фрагмента , До сих пор это хорошо для меня. Но я хотел узнать, есть ли способ установить максимальный жизненный цикл фрагмента при использовании компонента навигации?

Заранее спасибо.

...