首页 > 解决方案 > 旋转或更改语言对话框后再次显示

问题描述

安卓工作室 3.6

我想显示对话框并在按 OK 时隐藏它

我使用 LiveData 和 ViewModel。所以在我的活动中:

private lateinit var mainViewModel: MainViewModel


 mainViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)

       // Call only when activity is visible to user or rotate device or change lanugage
        mainViewModel.getShowDialogLiveData().observe(this, Observer {
            if (it != null) {
                showDialog(it)
            }
        })

  private fun showDialog(text: String) {
        val builder = AlertDialog.Builder(this)
        builder.setMessage(text)
            .setCancelable(false)
            .setPositiveButton("OK", { dialog, id ->
                dialog.cancel()
                dialog.dismiss()
            })
        val alert = builder.create()
        alert.show()
}

fun pressButtonShowDialog() {
  mainViewModel.isSuccessPaymentConfirm(true)
}



 override fun onActivityResult(requestCode: Int, resultCode: Int, resultIntent: Intent?) {
        if (requestCode == PAYMENT_CONFIRM) {
            if (resultCode == RESULT_OK) {
                mainViewM
            }
       }
}

在我的MainViewModel.kt

class MainViewModel(application: Application) : AndroidViewModel(application) {
private val showDialogLiveData = MutableLiveData<String>()

fun isSuccessPaymentConfirm(isSuccessPaymentConfirm: Boolean) {
        isShowDialogLiveData(true)

    }

fun isShowDialogLiveData(isShowDialogLiveData: Boolean) {
        this.isShowDialogLiveData.value = isShowDialogLiveData
        if (isShowDialogLiveData) {
            showDialogLiveData.value = "Message on dialog"
        }
}

fun getShowDialogLiveData(): LiveData<String> {
        return showDialogLiveData
}

结果,当在活动按下按钮时,然后调用pressButtonShowDialog(). 结果调用mainViewModel.getShowDialogLiveData()。显示结果对话框。当我旋转设备或更改语言时,再次显示对话框。因为又叫了mainViewModel.getShowDialogLiveData()。好的。很好。

然后我按下 OK 按钮,对话框隐藏(dialog.dismiss())。好的。

但是当我旋转设备或更改语言时,对话框再次显示,因为再次调用方法 mainViewModel.getShowDialogLiveData()

我怎样才能避免这种情况?当按下 OK 按钮时,对话框不能再次显示。

也许我需要从getShowDialogLiveData. 或者也许showDialogLiveData必须停止火灾事件。或者也许有其他解决方案?

标签: androidandroid-viewmodel

解决方案


在您的清单中将此行添加到所需的活动。

android:configChanges="keyboardHidden|keyboard|orientation|screenSize"

最终代码如下所示

  <activity android:name=".activities.xyz"
            android:configChanges="keyboardHidden|keyboard|orientation|screenSize"/>

推荐阅读