gpt4 book ai didi

android - 有什么方法可以使用 Kotlin Anko Alertdialog 来处理屏幕旋转变化?

转载 作者:行者123 更新时间:2023-11-29 22:53:36 25 4
gpt4 key购买 nike

使用 Anko 库非常简单,但是当我旋转屏幕时,我的对话框消失了。避免这种情况的唯一方法是将 DialogFragment() 的子项与方法 show(fm, TAG) 一起使用。

所以我们需要覆盖方法 onCreateDialog(savedInstanceState: Bundle?): Dialog 返回 Dialog 实例。但是 Anko 的 alert{ }.build() 返回 DialogInterface 实例

那么,在这种情况下,有什么办法可以使用anko吗?

alert {
message = "Message"
positiveButton("OK") {
//stuff
}
negativeButton("NOT OK") {
//stuff
}
}.show()

编辑

所以,这就是我所做的。我创建了抽象 BaseDialogFragment:

abstract class BaseDialogFragment : DialogFragment() {

abstract val ankoAlert: AlertBuilder<DialogInterface>

protected var dialogListener: DialogListener? = null

protected val vm by lazy {
act.getViewModel(DialogViewModel::class)
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
dialogListener = parentFragment as? DialogListener
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog =
(ankoAlert.build() as? Dialog)
?: error("Anko DialogInterface is no longer backed by Android Dialog")
}

然后我创建了一些对话框,例如:

class MyDialogFragment : BaseDialogFragment() {

companion object {
fun create() = MyDialogFragment ()
}

override val ankoAlert: AlertBuilder<DialogInterface>
get() = alert {
negativeButton(R.string.app_canceled) {
dialogListener?.onDismiss?.invoke()
}
customView = createCustomView(vm.data)
}

fun createCustomView(data: Data): View {
//returning view
}
}

我的 DialogListener 也是这样的:

interface DialogListener {

var onDismiss: () -> Unit

val onClick: (Data) -> Unit

var onPostClick: (Data) -> Unit

}

最后,在父 fragment 中我们可以使用:

MyDialogFragment.create().show(childFragmentManager, MyDialogFragment::class.java.simpleName)

希望对大家有所帮助。

最佳答案

来自 Android 文档,Dialog implements DialogInterface .因此,所有已知的 Dialog 子类(包括 AlertDialog)都实现了该接口(interface)。

您可以按如下方式转换并返回构建的结果:

return alert {
message = "Message"
positiveButton("OK") {
//stuff
}
negativeButton("NOT OK") {
//stuff
}
}.build() as Dialog

这会起作用,但是如果 Anko 改变了它的实现,你将得到一个 ClassCastException。要获得更清晰的错误,您可以使用以下内容。

val dialogInterface = alert {
message = "Message"
positiveButton("OK") {
//stuff
}
negativeButton("NOT OK") {
//stuff
}
}.build()
return (dialogInterface as? Dialog) ?: error("Anko DialogInterface is no longer backed by Android Dialog")

这会给你一个更明确的错误,但很可能不需要。

关于android - 有什么方法可以使用 Kotlin Anko Alertdialog 来处理屏幕旋转变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57656393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com