场景如下,我有一个包含 fragment 的ViewPager,每个 fragment 都有一些需要确认的 Action 。
我继续创建一个针对 fragment 的 DialogFragment,该 fragment 也知道如何处理结果,但是在用户确认或拒绝对话之前可能会重新创建该 fragment 。
我可以将 lambda 或某种其他形式的监听器传递给对话框,然后在用户确认对话框时调用它,但问题是如果设备随后旋转,lambda 将丢失,因为它不能被持久化在 bundle 上...
我唯一能想到的方法是为对话框分配一些 UUID,并将应用程序中的 UUID 连接到 lambda,lambda 保留在应用程序内部的 Map 上,但是这似乎是非常草率的解决方案..
我尝试在线搜索现有解决方案,例如material-dialogs librarys sample ,但大多数情况下似乎都忽略了旋转对话框,但这似乎也是一个草率的解决方案,因为对话框可能是较长流程的一部分,例如
请求购买 -> 取消 -> 显示带有解释的对话框 -> 如果用户想要再次购买
如果我们简单地关闭旋转对话,流动状态将会丢失
最佳答案
如果你传递匿名 lambda/Listener 你会在旋转后丢失它但是如果你让你的 Activity 实现你的监听器并在 fragment 的 onAttach(context)
方法中分配它,它将在 Activity 后重新分配重新创建。
interface FlowStepListener {
fun onFirstStepPassed()
fun onSecondStepPassed()
fun onThirdStepPassed()
}
class ParentActivity: Activity(), FlowStepListener {
override fun onFirstStepPassed() {
//control your fragments here
}
override fun onSecondStepPassed() {
//control your fragments here
}
override fun onThirdStepPassed() {
//control your fragments here
}
}
open class BaseDialogFragment : DialogFragment() {
var listener: FlowStepListener? = null
override fun onAttach(context: Context) {
super.onAttach(context)
if (context is FlowStepListener) {
listener = context
} else {
throw RuntimeException("$context must implement FlowStepListener")
}
}
override fun onDetach() {
super.onDetach()
listener = null
}
}
关于android - 持续配置更改的 DialogFragment 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54073897/