【问题标题】:dialog containing ViewPager包含 ViewPager 的对话框
【发布时间】:2018-12-20 15:53:44
【问题描述】:

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

我浏览了这些答案,但我不知道如何在我的情况下使用它们。

Viewpager in Dialog?

ViewPager in Custom Dialog

ViewPager in simple Dialog

【问题讨论】:

    标签: android android-viewpager fragment android-dialog


    【解决方案1】:

    您可以尝试通过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(StackOverflowError::class)
        fun getItemAt(index: Int) : Fragment {
            if (index >= fragmentList.size) throw StackOverflowError()
            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()
    
    }
    

    最后在你的ActivityFragment 分别在create()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

    【讨论】:

    • 感谢您的帮助,但我使用了另一种方法。我弹出了一个 Activity 作为对话框,然后在其中使用 View Pager,其中包含片段。
    猜你喜欢
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多