#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()
}
}
})