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