android 从 fragment 通过 viewpager 回调到 dialogfragment

android callback to dialogfragment from fragment through viewpager

大多数 Q/A 处理片段 -> 对话片段通信。我的情况恰恰相反,我一直未能找到能够从片段与使用 viewpager 的对话片段进行通信的想法或方法。

对话框片段有一个 viewpager,它使用 FragmentStatePagerAdapter 来加载不同的片段。只有2个片段。片段 1 提出了一些问题,片段 2 显示了结果。片段 1 在完成加载片段 2 的问题后需要向对话片段发送命令。

我试过使用界面,但应用程序崩溃,因为片段的 onAttach 中的侦听器为空。我也试过为所有其他人继承一个基本对话框片段 class,但也被证明是不成功的。

我可能遗漏了一些明显的东西,或者我的过程不正确。有人对此有想法或建议吗?

以防其他人出现并想知道如何解决这个问题。我通过将对话框片段 (FragmentNewTrips) class 通过 viewpager 然后传递到我将其设置为侦听器的子片段来解决这个问题。

所以,当我定义适配器时,我传递了作为对话片段的侦听器

AdapterPagerTrips(childFragmentManager, tripIds, this)

然后在适配器中我将对话片段 class 传递给需要它的相应片段

class AdapterPagerTrips (fragmentManager: FragmentManager, val tripIds: ArrayList<String?>,
                     val listener: FragmentNewTrips):FragmentStatePagerAdapter(fragmentManager,BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {

// 2
override fun getItem(position: Int): Fragment {
    if (position == 0) return FragmentNewTripsTypes.newInstance(listener)
    return FragmentNewTripsResults.newInstance(tripIds, listener)
}

// 3
override fun getCount(): Int {
    return 2
}
}

并且每个片段都有一个可以设置侦听器的伴随对象

companion object {
    fun newInstance(tripIds: ArrayList<String?>, listener: FragmentNewTrips) = FragmentNewTripsResults().apply {
        arguments = Bundle().apply { putStringArrayList(TRIPIDS, tripIds) }
        this.listener = listener
    }
}