首页 > 解决方案 > 如何将数据从 Fragment 传递到 DialogFragment

问题描述

我有一个Fragment带有 2ArrayList的 s,其中包含Strings我想从 中传递Fragment以在 a 中显示一些信息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()
    }
}

标签: androidandroid-fragmentskotlinandroid-adapterandroid-dialogfragment

解决方案


将数据从一个片段传递到另一个片段的规范方法是创建一个静态工厂方法,然后通过片段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")

推荐阅读