有什么方法可以使用 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")
这会给你一个更明确的错误,但很可能不需要。
使用 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")
这会给你一个更明确的错误,但很可能不需要。