Как передать данные из фрагмента в DialogFragment - PullRequest
0 голосов
/ 16 марта 2019

У меня есть Fragment с 2 ArrayList s, содержащими Strings, которые я хотел бы передать из Fragment, чтобы показать некоторую информацию в DialogFragment. Однако в настоящее время я заблудился относительно того, какой код я должен использовать для достижения этой цели. Я попытался добавить private val myListTitles: ArrayList<String>, private val myListDescriptions: ArrayList<String> в конструктор класса фрагмента, но это не сработало. Как правильно реализовать цикл for и получить положение каждого элемента вместо жесткого кодирования каждого элемента 1 на 1?

Фрагмент класса

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()
    }
}

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

Канонический способ передачи данных из одного фрагмента в другой состоит в создании статического фабричного метода и последующей передаче аргументов через пакет 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")
0 голосов
/ 16 марта 2019

Вы можете передать их, используя Eventbus, Liveata или введя синглтон для управления данными, затем вы можете прочитать их из любого места (фрагмент, действие, диалог и т. Д.). Если данные не изменятся, вы также можете поместить их в качестве общедоступной статической конечной переменной для любого класса и использовать ее из любого места

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...