Code for question on Github
我有一个使用片段+视图模型的应用程序。在一个片段中,当用户按下按钮时,我需要向他们提供选项列表。我正在使用AlertDialog构建器执行此操作,它可以解决该问题。但是,如果我打开该应用程序,请点击按钮以显示警报对话框,关闭对话框,然后旋转手机以触发拆解/重新构建警报对话框。
我正在使用Android的数据绑定将ui内容绑定到ViewModel(不确定是否重要)。所以基本流程是:
我在github上创建了一个简单的演示。
如果您克隆该仓库,然后启动应用程序,但不要按该按钮,则方向更改将按预期进行。如果单击该按钮并关闭对话框,然后旋转手机,您将看到重新显示AlertDialog。
答案 0 :(得分:0)
ViewModel的生命周期不同于片段的生命周期。当方向更改时,将重新创建Fragment,但ViewModel保留。
现在发生的是,当您更新MutableLiveData的值时,它将向观察者广播更新;当根据轮换更改重新创建Fragment时,它将再次重新订阅LiveData,并且由于值存在更新,因此MutableLiveData会将更新广播给新订阅的观察者。
例如,您应该将片段状态保存在onSaveInstanceState
中,使用savedInstanceState获取对MutableLiveData值的最后更新,并在显示对话框之前检查观察者是否发生了更改。
或者您可以将对话框逻辑移动到单击处理程序。我认为在观察员中显示对话框不是一个好方法。
答案 1 :(得分:0)
如果您正在使用LiveData和事件,this可以帮助您解决某些情况。总之,您应该使用 SingleLiveEvents