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

Is there any way to use Kotlin Anko Alertdialog with handling screen rotation changes?

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

一起使用

所以我们需要重写 onCreateDialog(savedInstanceState: Bundle?): Dialog 方法 returns Dialog 实例。但是Anko的alert{ }.build()returnsDialogInterface实例

那么,这种情况有什么办法可以使用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

}

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

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

希望对大家有所帮助。

如果您没有动态 UI,那么您可以在清单中的 activity 中使用 android:configChanges="orientation",看起来像:

<activity android:name=".MainActivity"
   android:configChanges="orientation">
...
</activity>

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

您可以按如下方式转换和 return 生成的结果:

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")

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