我一直在通过实现接口的活动在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感到好奇。我想知道如果我使用它会遇到什么问题其他选择中的一种,还是有一种更好的方法来实现我所缺少的?