PopBackStack навигации отключает дальнейшую навигацию к этому фрагменту

Я загружаю фрагмент при использовании компонента Navigation с этим кодом, и он работает.

findNavController().navigate(R.id.menu_nav_graph, bundleOf("menuItem" to item))

Я хочу закрыть фрагмент при нажатии кнопки, и я использую этот код для этого

findNavController().popBackStack()

Приложение переходит к предыдущему фрагменту, но когда я снова пытаюсь перейти к назначенному фрагменту с кодом выше, приложение достигает кода, и ничего не происходит. Фрагмент не загружается. Таким образом, код навигации выполняется, но фрагмент не открывается. То же самое происходит, когда вместо использования popBackStack я использую это с прослушивателем onClick

activity?.onBackPressed()

Тот же эффект, приложение достигает строки навигации, сбоев нет, исключений не возникает, просто не открывается фрагмент.

В то же время у меня работает навигация со стрелкой назад, и она несколько раз переходит в одно и то же место назначения после возврата из фрагмента. Это меня смущает, поскольку я использую тот же код в onOptionsItemSelected, и он работает, поэтому я не понимаю, что отличает его, когда я просто вызываю onBackPressed() нажатием кнопки.

override fun onOptionsItemSelected(item: MenuItem): Boolean =
        when (item.itemId) {
            android.R.id.home -> {
                activity?.onBackPressed()
                true
            }
            else -> super.onOptionsItemSelected(item)
        }

Как закрыть фрагмент нажатием кнопки и получить возможность последовательно перейти к тому же месту назначения?


person Rainmaker    schedule 11.10.2019    source источник
comment
Вы имеете в виду, что findNavController().navigate(R.id.menu_nav_graph, bundleOf("menuItem" to item)) не работает после возврата из предыдущего фрагмента?   -  person John Joe    schedule 14.10.2019
comment
да, именно то, что я имею в виду, он работает только для первого действия навигации, и когда вы его отступите, он не будет снова   -  person Rainmaker    schedule 14.10.2019


Ответы (1)


После дополнительной отладки я выяснил основную причину, проблема не в том, что navigation не выполняет навигацию, а в жизненном цикле Fragment в реализации библиотеки navigation. Fragment не был уничтожен при отступлении, а onBackPressed был запущен сразу после повторного перехода к тому же пункту назначения.

Для запуска onBackPressed я использую LiveData, нажимая эту команду из ViewModel. При возврате к Fragment та же команда была снова нажата на LiveData, и снова была запущена обратная навигация, так что казалось, что навигации не происходит.

Решение реализовывало SingleLiveEvent LiveData. Он только однажды подтолкнул стоимость.

Вот ссылка на реализацию https://github.com/android/architecture-samples/blob/dev-todo-mvvm-live/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/SingleLiveEvent.java

person Rainmaker    schedule 14.10.2019