Как восстановить состояние меню при изменении конфигурации - PullRequest
0 голосов
/ 18 июня 2020

У меня есть 2 пункта меню (кнопка фильтра и кнопка поиска), которые позволяют фильтровать или искать в списке. Когда элемент списка выбран, он передается в представление через LiveData viewModel, называемую listItemSelected, когда это происходит, мы переходим от ListFragment к DetailFragment и скрываем 2 кнопки из меню, поскольку они не здесь не имеет значения.

Моя проблема связана с изменением конфигурации, например, с поворотом экрана, старая активность уничтожается, а новая функция Activity.onCreate() вызывается до onCreateOptionsMenu(), поэтому я не знаю как я могу правильно вернуть состояние меню.

Упрощенный пример кода ниже, прямо сейчас он просто cra sh на filterMenuItem.isVisible = it == null, потому что filterMenuItem на этом этапе не инициализирован.

class MyActivity : AppCompatActivity() {

    private lateinit var viewModel: MyViewModel
    private lateinit var filterMenuItem: MenuItem
    private lateinit var searchMenuItem: MenuItem

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewModel = getViewModel { injector.myViewModel }
        viewModel.listItemSelected.observe(this, Observer {
            filterMenuItem.isVisible = it == null
            searchMenuItem.isVisible = it == null
        })
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.main_menu, menu)

        menu!!.apply {
            filterMenuItem = findItem(R.id.main_menu_filter)
            searchMenuItem = findItem(R.id.main_menu_search)
        }

        return true
    }

1 Ответ

1 голос
/ 18 июня 2020

Как насчет наблюдения за данными после инициализации MenuItem:

class MyActivity : AppCompatActivity() {

    private lateinit var viewModel: MyViewModel
    private lateinit var filterMenuItem: MenuItem
    private lateinit var searchMenuItem: MenuItem

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewModel = getViewModel { injector.myViewModel }
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.main_menu, menu)

        menu!!.apply {
            filterMenuItem = findItem(R.id.main_menu_filter)
            searchMenuItem = findItem(R.id.main_menu_search)
        }

        // observe after the menu items are initialized
        viewModel.listItemSelected.observe(this, Observer {
            filterMenuItem.isVisible = it == null
            searchMenuItem.isVisible = it == null
        })

        return true
    }
}
...