【问题标题】:How to pass data from Fragment to DialogFragment如何将数据从 Fragment 传递到 DialogFragment
【发布时间】:2019-03-15 21:55:51
【问题描述】:

我有一个 Fragment 和 2 个包含 StringsArrayLists,我想从 Fragment 传递以在 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()
    }
}

【问题讨论】:

    标签: android android-fragments kotlin android-adapter android-dialogfragment


    【解决方案1】:

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

    【讨论】:

    • 在“MyFragment”Fragment 中呢?里面的代码需要改吗?
    • 函数“newInstance”从未使用过。
    • 您将使用 newInstance 函数来实例化对话框片段,而不是调用默认构造函数。
    • 在我的片段中使用该代码会返回此错误:Unresolved reference: items
    • 你很可能需要传递两个列表,因为你的代码就是这样。提供的答案只是说明您如何传递 一个 字符串列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 2014-02-15
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    相关资源
    最近更新 更多