有什么方法可以等待 MaterialAlertDialogBuilder 的值? Android - 科特林
Any way to wait for the value from MaterialAlertDialogBuilder? Android - Kotlin
我知道我可以从使用对话框中用户输入的 MaterialAlertDialogBuilder 内部调用函数,但我想知道是否有一种方法(最好是一种好的做法)等待用户输入值和app 来执行前面的代码。我尝试将 async .await() 与 kotlin-coroutines 结合使用,但没有弄明白。
这是 MaterialAlertDialogBuilder 实现的示例。
val nameInputDialog = MaterialAlertDialogBuilder(requireContext())
val customAlertDialogView = LayoutInflater.from(requireContext())
.inflate(R.layout.dialod_input_et, null, false)
val inputNameDialog: EditText = customAlertDialogView.findViewById(R.id.input_dialog_et)
nameInputDialog.setView(customAlertDialogView)
.setTitle("Type the name")
.setPositiveButton("Accept") { dialog, _ ->
val nameToInput = inputNameDialog.text.toString()
if (nameToInput == "") {
Toast.makeText(requireContext(), "Type a name", Toast.LENGTH_SHORT)
.show()
makeDialogBoxAndSetGroupID()
} else if (nameToInput != "") {
GlobalScope.launch() {
nameToDisplay = async {
nameToInput
}
}
dialog.dismiss()
}
}
.setNegativeButton("Cancel") { dialog, _ ->
dialog.dismiss()
}.show()
您还需要等待什么?
如果您有一个带有 EditText 的对话框,并且您希望确保对话框保持打开状态直到用户键入您认为有效的内容,那么您需要委托所有这些验证,保留对对话框的引用,以及在您的 ViewModel 响应后采取相应行动。
简而言之
Fragment/Activity
: 创建一个对话框并保存一个引用。
val nameInputDialog = ... show()
里面onPositiveButton
:
val nameToInput = inputNameDialog.text.toString()
viewModel.inputNameChanged(nameToInput)
在您的 ViewModel 中:
fun inputNameChanged(name: String) {
//validate (preferably delegate to a validator/useCase so you can UT it)
if (validator.isValid(name)) {
_uiState.postValue(YourSealedClass.Valid(name))
} else {
_uiState.postValue(YourSealedClass.Empty())//for e.g.
}
}
回到你的 Fragment/Activity 你观察到这个的地方......
viewModel.uiState.observe(viewLifecycleOwner, Observer { state ->
when(state) {
is YourSealedClass.Valid -> dialog.dismiss()
is YourSealedClass.Empty -> {
Toast.makeText(...).show() //a toast is bad for this, but it works.
}
}
这就是how Google recommends你以一种“被动”的方式工作。
我知道我可以从使用对话框中用户输入的 MaterialAlertDialogBuilder 内部调用函数,但我想知道是否有一种方法(最好是一种好的做法)等待用户输入值和app 来执行前面的代码。我尝试将 async .await() 与 kotlin-coroutines 结合使用,但没有弄明白。
这是 MaterialAlertDialogBuilder 实现的示例。
val nameInputDialog = MaterialAlertDialogBuilder(requireContext())
val customAlertDialogView = LayoutInflater.from(requireContext())
.inflate(R.layout.dialod_input_et, null, false)
val inputNameDialog: EditText = customAlertDialogView.findViewById(R.id.input_dialog_et)
nameInputDialog.setView(customAlertDialogView)
.setTitle("Type the name")
.setPositiveButton("Accept") { dialog, _ ->
val nameToInput = inputNameDialog.text.toString()
if (nameToInput == "") {
Toast.makeText(requireContext(), "Type a name", Toast.LENGTH_SHORT)
.show()
makeDialogBoxAndSetGroupID()
} else if (nameToInput != "") {
GlobalScope.launch() {
nameToDisplay = async {
nameToInput
}
}
dialog.dismiss()
}
}
.setNegativeButton("Cancel") { dialog, _ ->
dialog.dismiss()
}.show()
您还需要等待什么?
如果您有一个带有 EditText 的对话框,并且您希望确保对话框保持打开状态直到用户键入您认为有效的内容,那么您需要委托所有这些验证,保留对对话框的引用,以及在您的 ViewModel 响应后采取相应行动。
简而言之
Fragment/Activity
: 创建一个对话框并保存一个引用。
val nameInputDialog = ... show()
里面onPositiveButton
:
val nameToInput = inputNameDialog.text.toString()
viewModel.inputNameChanged(nameToInput)
在您的 ViewModel 中:
fun inputNameChanged(name: String) {
//validate (preferably delegate to a validator/useCase so you can UT it)
if (validator.isValid(name)) {
_uiState.postValue(YourSealedClass.Valid(name))
} else {
_uiState.postValue(YourSealedClass.Empty())//for e.g.
}
}
回到你的 Fragment/Activity 你观察到这个的地方......
viewModel.uiState.observe(viewLifecycleOwner, Observer { state ->
when(state) {
is YourSealedClass.Valid -> dialog.dismiss()
is YourSealedClass.Empty -> {
Toast.makeText(...).show() //a toast is bad for this, but it works.
}
}
这就是how Google recommends你以一种“被动”的方式工作。