Как обрабатывать кнопку «Назад» при использовании вложенных фрагментов в Android

#android #kotlin #android-fragments #back-button #child-fragment

#Android #kotlin #android-фрагменты #кнопка возврата #дочерний фрагмент

Вопрос:

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

Вот как я открываю дочерние фрагменты:

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val contactsListFragment = ContactsListFragment()
    val groupsListFragment = GroupsListFragment()

    activity?.title = getString(R.string.contacts_and_groups)
    openChildFragment(contactsListFragment)

    binding.contactsButton.setOnClickListener {
        openChildFragment(contactsListFragment)
    }

    binding.groupsButton.setOnClickListener {
        openChildFragment(groupsListFragment)
    }
}

private fun openChildFragment(fragment: Fragment) {
    val childFragmentManager = childFragmentManager
    val transaction: FragmentTransaction = childFragmentManager.beginTransaction()
    transaction.replace(binding.contactsGroupsFl.id, fragment)
    transaction.addToBackStack(null)
    transaction.commit()
}
 

Если кто-нибудь может помочь мне с этой проблемой, было бы здорово. Спасибо!

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

1. старайтесь не помещать вложенные фрагменты в задний стек

2. Я отредактирую вопрос и покажу вам, как я открываю дочерние фрагменты, пожалуйста, взгляните @MuhammadAhmed

3. попробуйте удалить transaction.addToBackStack(null)

Ответ №1:

Я думаю, вам следует добавить прослушиватель для кнопки «Назад» в оба ваших фрагмента, чтобы вы могли очистить весь backstack при ее нажатии. Что-то вроде этого :

 requireActivity().onBackPressedDispatcher.addCallback(
    viewLifecycleOwner,
    object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            for (i: Int in 1..parentFragmentManager.backStackEntryCount) {
                parentFragmentManager.popBackStack()
            }
        }
    })