Как вернуться к последнему фрагменту в Android с помощью нижней панели навигации

#android #android-fragments #android-jetpack #android-bottomnav

#Android #android-фрагменты #android-реактивный ранец #android-bottomnav

Вопрос:

Я использую подход с одним действием и несколькими фрагментами и JetPackNavigation с NavGraph. Я добавил BottomNavigationBar для перехода к 2 фрагментам, которые работают должным образом. Теперь я хочу поместить backbuttom в BottomNavigationBar с намерением, чтобы, если кто-то нажмет на нее, она вернулась к самому последнему посещенному фрагменту. Я хочу знать, возможно ли что-то подобное, и нужно ли мне устанавливать соединения в NavGraph от всех фрагментов к другим фрагментам, чтобы он мог перемещаться обратно? Проблема в том, что мой NavGraph довольно большой и содержит много фрагментов.

Здесь вы видите скриншот из NavGraph, где я указал 2 фрагмента для навигации в нижней панели навигации (которые работают довольно хорошо).

Кроме того, здесь вы видите XML-код для нижней панели навигации.

 <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">


    <item
        android:id="@ id/Back_BottomNavigation"
        android:icon = "@drawable/ic_baseline_arrow_left_24"
        android:title = "Back" />

    <item
        android:id="@ id/FR_LanguageSelection"
        android:icon = "@drawable/ic_add_circle_full"
        android:title = "@string/Language" />

    <item
        android:id="@ id/Fragment1"
        android:icon = "@drawable/ic_add_circle_full"
        android:title = "Fragment1" />





</menu> 
 

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

NavGraph

Никто не знает, как я могу это сделать? Я довольно часто читал, что навигация по Jetpack хороша для обработки backstack. Верно ли это и как я могу это сделать?

Обновление: я вставил, как указано в одном ответе, прослушиватель для BottomNavigationView в MainActivity (в котором размещаются все фрагменты с использованием NavHostFragment). Теперь обратная навигация работает так, как должна. Однако обычная навигация по Jetpack с использованием других нижних частей нижней панели навигации больше не работает. Когда я нажимаю на другие нижние части, ничего не происходит (до добавления слушателя в основное действие он работал отлично). У вас есть какие-либо идеи, как я могу решить эту проблему? Вот код недавно добавленного прослушивателя в onCreateMethod класса MainActivity:

 //These commands were there before
        final  NavController navController = Navigation.findNavController(this,
                R.id.navHostfragment);
        NavigationUI.setupWithNavController(binding.bottomNavigation, navController);

//These are the new commands
 binding.bottomNavigation.setOnNavigationItemSelectedListener(
                new BottomNavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.Back_BottomNavigation:
                                navController.navigateUp();


                        }
                        return true;
                    }
                });
 

Есть какие-нибудь идеи о том, как решить эту проблему?

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

1. Как насчет findNavController().navigateUp()?

2. Спасибо, мин, за твой ответ. Где я должен написать этот код? У меня нет Java-файла для BottomNavigationBar (я просто создаю его в MainActivity), так как навигация работает автоматически, когда вы указали пункты назначения в BottomNavigationBar

Ответ №1:

Документация

установите желаемый параметр поведения в OnNavigationItemSelectedListener от BottomNavigationView

 yourBottomNavigationView.setOnNavigationItemReselectedListener(object : OnNavigationItemSelectedListener{
@override fun onNavigationItemSelected (MenuItem item){
  when(item){
    //insert your condition to match your requirement
  }
}

})
 

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

1. Когда я копирую код из вашей предыдущей ссылки в свой основной actvity, я получаю следующую ошибку «Анонимный класс lass, производный от OnNavigationItemSelectedListener’, должен быть либо объявлен абстрактным, либо реализовать абстрактный метод ‘onNavigationItemSelected (MenuItem)’ в ‘OnNavigationItemSelectedListener'»

2. Итак, вопрос в том, где (в каком фрагменте или активности) и как реализовать функциональность кнопки возврата

3. Спасибо ming за ваш ответ. Есть какие-либо комментарии к моему последнему комментарию? Я был бы очень признателен за каждый ваш дальнейший комментарий.

4. @VanessaF реализует прослушиватель, к которому вы привязываете свой BottomNavigationView, в основном в вашей деятельности.

5. Спасибо мин Чену за ваш ответ. Я реализовал то, что вы предложили, и теперь задняя кнопка работает. ОДНАКО: другие нижние части в BottomNavigationView больше не работают. Как было сказано ранее, я использую навигационные компоненты Jetpack, и при их использовании нижняя панель навигации перемещается «автоматически», просто указывая правильные имена в файлах меню. Однако при использовании вашего подхода у меня возникает ощущение, что эта «автоматическая» навигация устраняется. Итак, мой вопрос в том, как их объединить?