android - 持续配置更改的 DialogFragment 监听器

标签 android android-fragments dialog android-dialogfragment

场景如下,我有一个包含 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/

相关文章:

java - 如何通过在android中的.java文件中提供imgsrc来加载imageview

Android TextView默认行间距

java - SWT - MessageDialog - 外壳

java - 为什么 DialogFragment.dismiss 不立即终止对话框?

Android SDK - 获取字符串值的 R.id (int)

Android Studio 仅构建 1 个模块

android - 带有 ShareActionProvider 的共享按钮在操作栏上添加了两次

android - 底部的元素使用 AppBarLayout 在导航栏后面绘制元素

android - AutoCompleteTextView 函数 afterTextChanged 每次都会调用

c++ - 使用 dialog_fselect 选择文件