代码之家  ›  专栏  ›  技术社区  ›  wbk727

如何将数据从片段传递到对话框片段

  •  0
  • wbk727  · 技术社区  · 6 年前

    我有一个 Fragment 有2个 ArrayList s包含 Strings 我想从 碎片 DialogFragment . 但是,我现在不知道应该使用什么代码来实现这个目标。我试着加上 private val myListTitles: ArrayList<String>, private val myListDescriptions: ArrayList<String> 到片段类的构造函数,但这不起作用。正确的方法是什么 for 循环并得到每个项目的位置,而不是一个一个地对每个项目进行硬编码?

    碎片类

    class MyFragment : androidx.fragment.app.Fragment() {
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return inflater.inflate(R.layout.my_fragment, container, false)
        }
    
        override fun onActivityCreated(savedInstanceState: Bundle?) {
            val myListTitles = ArrayList<String>()
            myListTitles.add("Tab A")
            myListTitles.add("Tab B")
            myListTitles.add("Tab C")
    
            val myListDescriptions = ArrayList<String>()
            myListDescriptions.add("Description A")
            myListDescriptions.add("Description B")
            myListDescriptions.add("Description C")
    
    
            super.onActivityCreated(savedInstanceState)
        }
    }
    

    DialogFragment类

    class TabbedDialog : DialogFragment(private val myListTitles: ArrayList<String>, private val myListDescriptions: ArrayList<String>) {
        lateinit var customView: View
    
        private var myListTitles = myList.toMutableList()
        private var myListDescriptions = myList.toMutableList()
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return customView
        }
    
        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    
            val b = AlertDialog.Builder(activity)
                    .setTitle("Dialog Title")
                    .setPositiveButton("OK") { dialog, _ -> dialog.dismiss() }
    
            customView = activity!!.layoutInflater.inflate(R.layout.fragment_dialog, null)
    
            val tabLayout = customView.findViewById<TabLayout>(R.id.mTabLayout)
            val viewPager = customView.findViewById<ViewPager>(R.id.mViewPager)
    
            val adapter = TabbedDialogAdapter(childFragmentManager)
            adapter.addFragment("Tab A", TabbedDialogFragment.createInstance("Description A"))
            adapter.addFragment("Tab B", TabbedDialogFragment.createInstance("Description B"))
            adapter.addFragment("Tab C", TabbedDialogFragment.createInstance("Description C"))
    
            val adapter = TabbedDialogAdapter(childFragmentManager)
            for (item in myList) {
                // ¿What goes here?
    
                // My guess
                // adapter.addFragment(myListTitles[position], TabbedDialogFragment.createInstance(myListDescriptions[position]))
            }
    
            viewPager.adapter = adapter
            tabLayout.setupWithViewPager(viewPager)
    
            b.setView(customView)
            return b.create()
        }
    }
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   Francesc    6 年前

    将数据从一个片段传递到另一个片段的规范方法是创建一个静态工厂方法,然后通过片段传递参数 arguments 捆绑,像这样:

    class MyDialogFragment : DialogFragment() {
    
        private lateinit var items: List<String>
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            items = arguments?.getStringArrayList(ITEMS) ?: throw IllegalStateException("No args provided")
        }
    
        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
            /* omitted */
        }
    
        companion object {
    
            private const val ITEMS = "items"
    
            fun newInstance(
                    items: ArrayList<String>
            ): MyDialogFragment = MyDialogFragment().apply {
                arguments = Bundle().apply {
                    putStringArrayList(ITEMS, items)
                }
            }
        }
    
    }
    

    编辑:

    在你的片段里你会这样称呼它

    val dialog = MyDialogFragment.newInstance(items)
    dialog.show(childFragmentManager, "dialog")
    
    推荐文章