Сбой/Проблема навигации диалогового фрагмента Android

#android #android-dialogfragment #android-architecture-components

Вопрос:

У меня есть график навигации по диалогам, который отлично работает, если я не закрываю диалоги при переходе к другому. Но затем диалоговое окно, из которого я перемещаюсь, не исчезает с экрана. Если я отклоню их во время навигации, приложение выйдет из строя.

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val navHostFragment = activity?.supportFragmentManager?.findFragmentById(R.id.dialogNavigation) as NavHostFragment
        val navController = navHostFragment.navController
        super.onViewCreated(view, savedInstanceState)
        binding.btnNext.setOnClickListener{
            navController.navigate(R.id.action_retryConnectionDialog_to_batteryDialog)
            dismiss()
        }
    }

 

Это часть кода (в рамках RetryConnectionDialog.kt), которая вызывает такие реакции, любая информация будет оценена по достоинству

Ответ №1:

Если вы хотите, чтобы закрыть диалоговое окно при перемещении на новое место, вы должны сделать это как часть ваших navigate() действий при использовании popUpTo на вашей action_retryConnectionDialog_to_batteryDialog dismiss это асинхронная операция, которая бывает только после вашего navigate() вызова, что означает, что это слишком поздно, чтобы удалить его из заднего стека (как новый BatteryDialog уже уложенные поверх него).

     <action
        android:id="@ id/action_retryConnectionDialog_to_batteryDialog"
        app:destination="@id/batteryDialog"
        app:popUpTo="@ id/retryConnectionDialog"
        app:popUpToInclusive="true"/>
 

Ответ №2:

В зависимости от навигационного графика, который не был предоставлен, это может быть скорее:

 navController.navigateUp()
navController.navigate(R.id.action_retryConnectionDialog_to_batteryDialog)
 

Комментарии:

1. Позвонив navigateUp() , вы синхронно вернетесь к предыдущему пункту назначения. Это означает, что любые действия, подобные action_retryConnectionDialog_to_batteryDialog тем, которые связаны с retryConnectionDialog тем, что они больше не становятся доступными, поэтому этот подход не работает (и это именно то popUpTo , для чего он предназначен).