首页 > 解决方案 > android通过viewpager从片段回调到dialogfragment

问题描述

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

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

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

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

标签: androidandroid-fragmentsandroid-viewpager

解决方案


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

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

AdapterPagerTrips(childFragmentManager, tripIds, this)

然后在适配器中,我将对话框片段类传递给需要它的相应片段,就像这样

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
    }
}

推荐阅读