Найти предыдущий активный фрагмент

У меня 4 фрагмента. Ниже приведен процесс навигации.

[Фрагмент 1] -> [Фрагмент 2] -> [Фрагмент 3]

[Фрагмент 4] -> [Фрагмент 3]

Если пользователь переходит к фрагменту 3 из 4 (т.е. [Фрагмент 4] -> [Фрагмент 3]) при обратном нажатии [Фрагмент 3], он должен перейти к [Фрагмент 1].

Думаю, если мне удастся найти предыдущий фрагмент, тогда будет легко перенаправить на [fragment 1]. Есть ли способ найти замененный предыдущий фрагмент?

Я пробовал fragmentManager.getBackStackEntryAt (fragmentManager.backStackEntryCount - 1), но показывает только одну запись текущего фрагмента.

Менеджер фрагментов выглядит так.

Объект FragmentManager

onBackPressed из Fragment 3 это я сделал примерно так.

override fun onBackPressed(): Boolean {
    args.host.hideKeyboard()

    if (redirectToProductList) {
        args.host.activity?.let {
            if (it.supportFragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)) {
                openFirstFragment(it, SupportFragment(MainActivity.SalesRepProduct))
                return true
            }
        }
    }
    return args.host.childFragmentManager.popBackStackImmediate()
}

person Hammad Arshad    schedule 27.12.2018    source источник
comment
Возможный дубликат вкладок изменения onBackPressed в android   -  person Ashish    schedule 27.12.2018


Ответы (2)


Я решил проблему. Я не добавлял фрагмент в backstack.

fragmentManager.beginTransaction()
            .addToBackStack(newFragment.javaClass.name)
            .commit()

Затем я нашел предыдущий такой фрагмент.

override fun onBackPressed(): Boolean {
    args.host.hideKeyboard()
    val index = args.host.fragmentManager.backStackEntryCount - 2
    if (index >= 0) {
        val prevFrag = args.host.fragmentManager.getBackStackEntryAt(index)
        if (prevFrag.name == SearchContainerPresenter::class.java.name)
            args.host.activity?.let {
                if (it.supportFragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)) {
                    openFirstFragment(it, SupportFragment(MainActivity.SalesRepProduct))
                    return true
                }
            }
        else
            return args.host.childFragmentManager.popBackStackImmediate()
    }
    return args.host.childFragmentManager.popBackStackImmediate()
}
person Hammad Arshad    schedule 28.12.2018

Вы можете использовать такой пользовательский слушатель,

supportFragmentManager.addOnBackStackChangedListener {
    val fragment = supportFragmentManager.findFragmentById(R.id.container)
    //Write your logic here
}
person Akash Dubey    schedule 28.12.2018