Проблема возврата из текущего фрагмента обратно к замененному фрагменту при использовании NavHostFragment - PullRequest
0 голосов
/ 10 июля 2020

У меня есть три фрагмента A, B и C. И я использую контейнер navHostFragment в MainActivity. Таким образом, приложение переходит от A до B с использованием kotlin функции расширения findNavController().navigate..., а затем go от B до C с использованием той же функции. Все работает нормально, пока здесь.

Теперь во фрагменте C я заменяю разные элементы на фрагмент C, используя

activity?.supportFragmentManager
?.beginTransaction()
?.replace(R.id.list_container, someFragment)
?.addToBackStack("some_frag_id")
?.commit()

list_container заменяется на someFragment . После этого, когда я нажимаю физическую кнопку возврата, выскакивает фрагмент C, и мое приложение переходит к фрагменту B, в то время как то, что я ожидаю восстановить, заменено list_container, т.е. все, что было до замены.

Я также перехожу это в моем MainActivity

override fun onBackPressed() {
    val count = supportFragmentManager.backStackEntryCount
    if (count == 0) {
        super.onBackPressed()
        //additional code
    }
    else {
        supportFragmentManager.popBackStack()
    }
}

Я не уверен, что здесь отсутствует. Я прочитал много решений по stackoverflow, но ни одно из них не удовлетворило меня. Пожалуйста, проведите.

1 Ответ

1 голос
/ 10 июля 2020

Если вы добавляете фрагмент в представление внутри фрагмента, вы всегда должны использовать childFragmentManager - использование activity?.supportFragmentManager всегда является неправильным FragmentManager для использования в этом случае.

Помимо исправления случаев с восстанавливая состояние (которое не сработает при использовании неправильного FragmentManager), это также гарантирует, что поведение по умолчанию для отправки onBackPressed() вниз по иерархии FragmentManager будет работать без изменений - вам вообще не нужно никаких logi c в onBackPressed() чтобы всплывающее окно работало правильно.

Если вам нужно перехватить кнопку возврата во фрагменте C, вы должны следовать , предоставляя настраиваемую обратную документацию , чтобы зарегистрировать OnBackPressedDispatcher - вы не следует отменять onBackPressed() даже в этих случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...