Kotlin中Fragment和DialogFragment之间的通信

时间:2019-11-23 21:09:19

标签: android kotlin dialogfragment

我一直在通过实现接口的活动在DialogFragment和Fragment之间进行完全错误的通信,然后告诉该怎么做。这似乎很浪费空间,而且充满了潜在的错误,因此我一直在努力直接与片段进行通信。我一直在尝试找出最佳方法。我发现了3种方法,但是我不确定哪种方法最好实现,尤其是当我只有DialogFragment要使用的1种函数时。

选项1:界面

这似乎是“转到”方法,我的片段实现了侦听器,然后在我放入的DialogFragment中

override fun onAttach(context: Context) {
    try {
        dialogListener = parentFragment as MyDialogListener
    }catch (exception: ClassCastException){
        throw ClassCastException("$parentFragment must implement MyDialogListener")
    }
}

这就是我一直在做的方式(除非我使用上下文之前,现在直接使用该片段),但是我不确定是否值得在仅用于以下用途的对话框中为1个函数创建一个接口1个特定片段。

选项2:单位

class MyDialog: AppCompatDialogFragment(){
    lateinit var test: (String) -> Unit

    companion object {
        fun newInstance(testFunction: (String) -> Unit) = MyDialog().apply {
            test = testFunction
        }
    }
}

然后在创建我可以使用的DialogFragment时

MyDialog.newInstance() { test -> Log.e(tag, test) }

并从对话框内的任何位置调用它:test("This is a test")

这就是我一直在处理只需要1个功能的RecyclerViewAdapters的方式,以防止需要创建接口,但是由于我直接在newInstance中操作DialogFragment,因此我认为这是不好的做法(我传递的所有其他数据)通过捆绑销售),想知道是否会引起任何问题?

选项3:投射片段

通过这种方式,我可以访问MyFragment中可用的所有公共功能,但不需要构建接口。

override fun onAttach(context: Context) {
    try {
        myFragment = parentFragment as MyFragment
    }catch (exception: ClassCastException){
        throw ClassCastException("$parentFragment must be instance of MyFragment")
    }
}

现在,这似乎是一个非常糟糕的主意,但是我不确定为什么。我能想到的唯一原因是,如果我想在其他“片段”中使用它,它将无法真正起作用。但是,如果我确定该对话框只能在此片段中使用,那么我还会遇到其他潜在问题吗?

所有3个选项均可编译,表面上似乎工作正常。我一直在使用选项1,我想使用选项2来传递单个单元,而无需创建接口,实际上只是对选项3感到好奇。我想知道如果我使用它会遇到什么问题其他选择中的一种,还是有一种更好的方法来实现我所缺少的?

0 个答案:

没有答案