Навигация popBackStack отключает дальнейшую навигацию к этому фрагменту - PullRequest
0 голосов
/ 11 октября 2019

Я загружаю фрагмент при использовании компонента 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)
        }

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

1 Ответ

0 голосов
/ 14 октября 2019

После дополнительной отладки я выяснил причину, проблема не в том, что 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

...