Передача данных из фрагмента нижней таблицы в предыдущий фрагмент

#android #android-fragments #android-dialogfragment #bottom-sheet

Вопрос:

Есть ли лучший способ отправить данные обратно в предыдущий фрагмент/родительский фрагмент, кроме прослушивателя?

У меня есть фрагмент, который состоит из списка предметов. Щелчок по элементам откроет фрагмент нижнего листа. При закрытии всплывающего окна нижнего листа мне нужно передать данные обратно в сам фрагмент.

То, что я сделал до сих пор, — это создал слушателя и реализовал его.

Ответ №1:

Это действительно зависит от того, какие компоненты вы используете. Если вы используете компоненты Android Jetpack, ознакомьтесь с этой статьей: ССЫЛКА

Вы должны иметь возможность передавать данные взад и вперед аналогично передаче данных с startActivityForResult()

Кроме того, пока вы этим занимаетесь, пожалуйста, ознакомьтесь также с официальной документацией, есть хороший пример, который поможет вам лучше понять это: ССЫЛКА

Ответ №2:

Хотя вы упоминаете любой другой способ, кроме слушателя, но согласно документам:

Начиная с фрагмента 1.3.0-alpha04, каждый диспетчер фрагментов реализует свойство FragmentResultOwner. Это означает, что диспетчер фрагментов может выступать в качестве центрального хранилища результатов фрагментов. Это изменение позволяет компонентам взаимодействовать друг с другом, задавая результаты фрагментов и прослушивая эти результаты…

Задает FragmentResultListener для данного ключа запроса. Как только данный владелец жизненного цикла окажется, по крайней мере, в НАЧАЛЬНОМ состоянии, любые результаты, заданные setFragmentResult с использованием того же ключа запроса, будут доставлены в обратный вызов. Обратный вызов будет оставаться активным до тех пор, пока владелец жизненного цикла не достигнет УНИЧТОЖЕННОГО состояния или не будет вызван clearFragmentResultListener с тем же ключом запроса.

Чтобы передать данные обратно во фрагмент A из фрагмента B, сначала установите прослушиватель результатов для фрагмента A, фрагмента, который получает результат. Вызовите setFragmentResultListener() в FragmentManager фрагмента A, как показано ниже:

в вашем классе нижнего листа:

 btncloseBottomSheet.setOnClickListener {
            val result = Bundle().apply {
                // put your data in bundle
                putInt("MY_KEY", 6)
            }
            setFragmentResult("requestCode", result)
            dismiss()
        }
 

в вашем предыдущем фрагменте/родительском фрагменте вам необходимо реализовать FragmentResultListener:

     class PreviousFragment : FragmentResultListener {
    ...
    
    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            
            // set fragment listener
            parentFragmentManager.setFragmentResultListener(
                            "requestCode",
                            viewLifecycleOwner,
                            this
                    )
    
        }
    ...
    
    // get result from other fragments by FragmentResultListener
        override fun onFragmentResult(requestKey: String, result: Bundle) {
    
            when (requestKey) {
    
                "requestCode" -> {
                    val resultFromBundle = result.getInt("MY_KEY")
                    // Do somthing
                }
            }
    
        }

}