Android 如何在配置更改时恢复菜单状态

Android 如何在配置更改时恢复菜单状态,android,android-lifecycle,android-viewmodel,Android,Android Lifecycle,Android Viewmodel,我有两个菜单项filter button和search button,允许在列表中进行筛选或搜索。当一个列表项被选中时,它将通过viewModel的名为listItemSelected的LiveData提供给视图。当这种情况发生时,我们将从ListFragment移动到DetailFragment,并从菜单中隐藏这两个按钮,因为它们在这里不相关 我的问题是在配置更改上,例如在屏幕旋转上,旧的活动被销毁,并且在OnCreateOptions菜单之前调用了new activity.onCreate函

我有两个菜单项filter button和search button,允许在列表中进行筛选或搜索。当一个列表项被选中时,它将通过viewModel的名为listItemSelected的LiveData提供给视图。当这种情况发生时,我们将从ListFragment移动到DetailFragment,并从菜单中隐藏这两个按钮,因为它们在这里不相关

我的问题是在配置更改上,例如在屏幕旋转上,旧的活动被销毁,并且在OnCreateOptions菜单之前调用了new activity.onCreate函数,因此我不知道如何正确设置菜单状态

下面是简化的代码示例,现在它只是在FilterManuItem.isVisible=it==null上崩溃,因为此时FilterManuItem未初始化

类MyActivity:AppCompatActivity{ 私有lateinit var viewModel:MyViewModel 私有lateinit变量filterMenuItem:MenuItem 私有lateinit var searchMenuItem:MenuItem 覆盖乐趣onCreatesavedInstanceState:捆绑{ super.onCreatesavedInstanceState viewModel=getViewModel{injector.myViewModel} viewModel.listItemSelected.observethis,Observer{ filterMenuItem.isVisible=it==null searchMenuItem.isVisible=it==null } } 覆盖创建选项菜单菜单:菜单?:布尔值{ 菜单充气机菜单主菜单 菜单!!申请{ filterMenuItem=findItemR.id.main\u菜单\u过滤器 searchMenuItem=findItemR.id.main\u菜单\u搜索 } 返回真值 }
初始化菜单项后观察数据如何:


谢谢,这是如此的基本,我甚至没有想过它,无论出于什么原因,我把我所有的观察都绝对放在了onCreate方法中。是的,当然。我会等一等,看看是否有人有其他想法,并对安卓生命周期进行一些研究。不知何故,我想出了一些更难的方法,比如Dagger或RxJava,但安卓生命周期仍然是一个谜啊,我啊哈。
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
    }
}