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

#java #android #android-fragments #android-navigation

Вопрос:

У меня есть нижняя панель навигации с 4 кнопками. Один из них-кнопка «Назад», которая просто переходит к ранее отображенному фрагменту (я использую подход с несколькими фрагментами для одного действия). В принципе, все работает нормально. Теперь я хотел знать, можно ли не возвращаться к определенному фрагменту А? Таким образом, в основном всякий раз, когда этот фрагмент A был последним отображаемым фрагментом, и пользователь нажимает кнопку «Назад», он не должен перемещаться назад, а должен оставаться на текущем фрагменте (и, возможно, отображать небольшое всплывающее сообщение).

Итак, здесь вы можете увидеть мою основную деятельность, в которой реализована навигация:

 package com.example.td.bapp;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.fragment.app.FragmentManager;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.NavigationUI;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;

import com.example.td.bapp.databinding.ActivityMainBinding;
import com.google.android.material.bottomnavigation.BottomNavigationView;

import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;


public class MainActivity extends AppCompatActivity  {

   public static DataBaseHelper myDB;
   public static boolean veryFirstCreation = true;


    private ActivityMainBinding binding;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        
        super.onCreate(savedInstanceState);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();

        setContentView(view);

        final  NavController navController = Navigation.findNavController(this,
                R.id.navHostfragment);
       NavigationUI.setupWithNavController(binding.bottomNavigation, navController);

        myDB=new DataBaseHelper(this);

        if(veryFirstCreation) {
            navController.navigate(R.id.FR_LanguageSelection);
            veryFirstCreation = false;
        }





          // Define the bahaviour when clicking on items of the bottomNavigationBar; Overwrites the JetpackNavigation behaviour (automatic navigation using the id specified in the BottomNavigation XML menu file)
        binding.bottomNavigation.setOnNavigationItemSelectedListener(
                new BottomNavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                        if (item.getItemId()== R.id.BottomNavigation_Back) {
                            //Here I navigate back to the previous fragment
                            navController.navigateUp();

                        }

                        if (item.getItemId()== R.id.BottomNavigation_Language) {
                            navController.navigate(R.id.FR_LanguageSelection);
                        }

                        if (item.getItemId()== R.id.BottomNavigation_MyItems) {
                            navController.navigate(R.id.FR_MyItems);
                        }

                        if (item.getItemId()== R.id.BottomNavigation_Menu) {
                            navController.navigate(R.id.FR_Menu);
                        }



                        return true;
                    }
                });


        };




    }
 

Я был бы признателен за каждый комментарий и был бы очень благодарен вам за помощь.

Ответ №1:

Вы можете использовать SupportFragmentManager, с помощью которого вы сможете узнать, содержит ли ваш задний стек хотя бы один фрагмент. Используйте это в функции «Назад» (или, при необходимости, в нажатом на кнопку «Назад»).

 FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() ==1) {
    Log.d("ppl","This is the last fragment. Show your message, poppup or whatever you want here")

} else if (fm.getBackStackEntryCount() >1) {
    Log.d("ppl","the backstack still have more to show")
    fm.popBackStackImmediate();
}
 

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

1. Спасибо Фелипе за ваш ответ. Однако этот ответ не совсем то, о чем я просил. Я бы не хотел возвращаться к определенному фрагменту (назовем этот Фрагмент_А). У меня много фрагментов в моей деятельности, и кнопка «Назад» должна всегда перемещаться назад, за исключением фрагмента_a. Поэтому всякий раз, когда Фрагмент_А был последним отображаемым фрагментом, кнопка «Назад» не должна перемещаться назад.