Как заставить действие «Настройки» вернуться к правильному фрагменту в основном действии?

#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. Поэтому измените существующую логику, чтобы справиться со случаем реагирования на возвращенную информацию из второго действия.