包含 ViewPager 的对话框

dialog containing ViewPager

我想创建一个对话框,其中包含 ViewPager,它有 3 个页面,所有页面都有不同的布局结构。我想要一个解决方案,我可以通过编程方式设置布局内容。我认为这可以通过为每个页面制作片段来完成,但我不知道该怎么做。

我仔细阅读了这些答案,但我不知道如何在我的案例中使用它们。

Viewpager in Dialog?

ViewPager in Custom Dialog

ViewPager in simple Dialog

您可以尝试通过 DialogFragment 构建您的自定义对话框。考虑 XML 布局将包含一个 ViewPager 并且要执行的代码将是:

class PagerDialog : DialogFragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.element_fragment_pager_dialog, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        setupPager()
    }

    private fun setupPager() {
        val pagerFragment1 = PagerFragment1.newInstance()
        val pagerFragment2 = PagerFragment2.newInstance()
        val pagerFragment3 = PagerFragment3.newInstance()
        viewPager?.adapter = MyFragmentPagerAdapter(childFragmentManager).apply {
            adapterReference = object : PageAdapterInterface {
                override var fragmentList: List<Fragment> = 
                        mutableListOf(pagerFragment1, pagerFragment2, pagerFragment3)

            }
        }
    }

    companion object {
        const val tag = "PagerDialog"
    }
}

我使用了对列表的引用,因为如果处理不当可能会导致泄漏。所以 PagerAdapterInterface 看起来像:

interface PageAdapterInterface {
    var fragmentList: List<Fragment>
    fun getItemCount() = fragmentList.size

    @Throws(WhosebugError::class)
    fun getItemAt(index: Int) : Fragment {
        if (index >= fragmentList.size) throw WhosebugError()
        return fragmentList[index]
    }
}

您的视图寻呼机适配器可以以引用访问的方式使用此引用,例如:

class MyFragmentPagerAdapter(childFragmentManager: FragmentManager) : FragmentStatePagerAdapter(childFragmentManager){
    lateinit var adapterReference: PageAdapterInterface
    override fun getItem(p0: Int): Fragment = adapterReference.getItemAt(p0)

    override fun getCount(): Int = adapterReference.getItemCount()

}

最后在 ActivityFragmentcreate()onViewCreated() 函数中,您可以初始化对话框,如下所示:

class MyActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // use childFragmentManager if the code is
        // used within the Fragment

        val prev = supportFragmentManager.findFragmentByTag(PagerDialog.tag)
        if (prev != null) {
            supportFragmentManager.beginTransaction()
                    .remove(prev)
                    .addToBackStack(null)
                    .commit()
        }
        PagerDialog().show(supportFragmentManager, PagerDialog.tag)
    }
}

注意: DialogFragment 已弃用 > API 28 查看 https://developer.android.com/reference/android/app/DialogFragment