#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
}
}
}
}