#android #kotlin #android-fragments #android-architecture-navigation
#Android #kotlin #android-фрагменты #android-архитектура-навигация
Вопрос:
Я использую навигацию Android с двумя фрагментами «Фрагмент A» и «Фрагмент B»
В «Фрагменте A» я открываю «Фрагмент B»:
findNavController().navigate(R.id.action_fragmenta_to_fragmentb)
В «Фрагменте B» я открываю средство выбора файлов с помощью startActivityForResult:
val openFileIntent = Intent(Intent.ACTION_OPEN_DOCUMENT)
openFileIntent.addCategory(Intent.CATEGORY_OPENABLE)
openFileIntent.type = "application/json"
val mimeTypes = arrayOf("application/octet-stream")
openFileIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes)
startActivityForResult(
Intent.createChooser(
openFileIntent,
getString(R.string.load_from_file)), 909)
В «Фрагменте B» при выборе файла я получаю результат onActivityResult, как и ожидалось:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
//Do something with data from the file
}
Чего я не понимаю, так это того, что теперь я вижу отображаемый «Фрагмент A» вместо того, чтобы оставаться в «Фрагменте B». Я делаю что-то не так или это проблема при использовании навигационного компонента с startActivityForResult? У кого-нибудь есть исправление, чтобы приложение оставалось во фрагменте, где был вызван startActivityForResult ? Мне трудно найти документацию об интеграции навигационного компонента с Intents, который запускает процессы вне приложения (т. Е. средство выбора файлов, вызывающее приложение).
Комментарии:
1. Навигация всегда сохраняет ваше состояние точно там, где вы были, вызываете ли вы
startActivityForResult()
и возвращаетесь к своему приложению, используете ли вы «Не сохранять действия» и нажимаете кнопку «Домой» и т. Д. Похоже, что-то еще, что вы делаете, это удаляете ваш фрагмент B из заднего стека (поскольку, если вы получитеonActivityResult()
, он все еще был в заднем стеке, когда вы вернулись изstartActivityForResult()
).2. @ianhanniballake Вы были совершенно правы. За пределами двух фрагментов я прослушивал некоторые события и программно переходил к фрагменту A. Я просто был слишком сосредоточен на том, что что-то не так в среде navgation — большое вам спасибо за подсказку!
Ответ №1:
Как указано в комментарии Ians к моему вопросу, я прослушал некоторые события в основном действии и при некоторых обстоятельствах программно перешел к «Фрагменту A». После удаления этой навигации приложение остается в «Фрагменте B» после выбора файла, как я и ожидал.