#android #kotlin #android-fragments
Вопрос:
У меня есть простое приложение для Android, основанное на основной деятельности. У меня есть 6 фрагментов, которые отображаются в основном действии в зависимости от состояния конечного автомата (https://github.com/Tinder/StateMachine).
Машина состояний изменяет состояние на основе входных данных из различных фрагментов, а также фоновых процессов. Например, если приложение теряет контакт с устройством, подключенным по Bluetooth, состояние изменяется, как и фрагмент, отображаемый в Основном действии. У меня также есть действие «Настройки» с несколькими опциями.
Пока что весь код работает. При изменении состояния, будь то с помощью фоновых процессов или нажатия кнопки на отображаемом в данный момент фрагменте, экран изменяется правильно.
Мой вопрос касается кнопки «Назад» на панели инструментов в разделе «Настройки». Кнопка «Назад» возвращает к правильному основному фрагменту действия, за исключением случаев, когда состояние изменяется во время просмотра действия «Я просматриваю настройки». Я не уверен, как вернуть кнопку «Назад» на панели инструментов «Настройки», чтобы перейти к правильному фрагменту в основном действии, когда фоновый процесс изменяет текущее состояние.
Я запускаю действие «Настройки» в основном действии, используя:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_settings -> {
// launch settings activity
startActivity(Intent(this@MainActivity, SettingsActivity::class.java))
return true
}
else -> super.onOptionsItemSelected(item)
}
}
В Настройках активности у меня есть:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
android.R.id.home -> {
LOG.info("trying to get home")
finish()
true
}
else -> super.onOptionsItemSelected(item)
}
}
У меня есть этот код в основном действии для изменения фрагмента в зависимости от нового состояния государственной машины:
fun renderViewState(newTransition: RLSideEffect, message: String) {
LOG.info("MainActivity: renderView: newTransition=$newTransition")
val navController = findNavController(R.id.nav_host_fragment_content_main)
when (newTransition) {
is RLSideEffect.LogStart -> {
LOG.info("MainActivity: LogStart")
navController.navigate(R.id.action_StartFragment)
toast { message }
}
is RLSideEffect.LogConnected -> {
LOG.info("MainActivity: Connected")
navController.navigate(R.id.action_ConnectedFragment)
toast { message }
}
is RLSideEffect.LogContinuityOK -> {
LOG.info("MainActivity LogContinuityOK")
navController.navigate(R.id.action_ContinuityOkFragment)
toast { message }
}
is RLSideEffect.LogContinuityFailed -> {
LOG.info("MainActivity: LogContinuityFailed")
navController.navigate(R.id.action_ContinuityFailedFragment)
toast { message }
}
is RLSideEffect.LogArmed -> {
LOG.info("MainActivity: LogArmed")
navController.navigate(R.id.action_ArmedFragment)
toast { message }
}
is RLSideEffect.LogIgnition -> {
LOG.info("MainActivity: LogIgnition")
navController.navigate(R.id.action_IgnitionFragment)
toast { message }
}
}
}
Как заставить действие «Настройки» вернуться к текущему состоянию (фрагменту) основного действия, а не только к точке, из которой было запущено действие «Настройки»?
Комментарии:
1. Вы можете использовать механизм запуска действия для получения результата. Но не было бы проще разместить фрагмент настроек в одном и том же действии?
2. Совершенно определенно! Можете ли вы указать мне ресурс, который помог бы мне изменить способ запуска фрагмента настроек?
3. Как и любой другой фрагмент на навграфе. И он может вызвать эту функцию активности, которую вы показали.
4. developer.android.com/training/basics/intents/result
5. Поэтому измените существующую логику, чтобы справиться со случаем реагирования на возвращенную информацию из второго действия.