#fragment
Для передачи данных между двумя фрагментами, существовало одно распространённое API —
targetFragment. По сути,
targetFragment предоставляет нам способ получения данных через back stack, а всё что нам нужно — это переопределить onActivityResult в вызывающем фрагменте. Несмотря на кажующуюся простоту, это API — не очень удобное.
Во-первых,
targetFragment будет работать если фрагменты находятся в одном и том же менеджере. Во-вторых, API разбросано по коду и становится непонятно, откуда прилетел тот или иной кусок данных.
Не так давно появилось новое решение —
FragmentResultOwner. По сути, это callback, который есть у каждого FragmentManager. Это изменение позволяет отдельным фрагментам взаимодействовать друг с другом, отправляя результаты фрагмента и прослушивая эти результаты, не требуя, чтобы фрагменты имели прямые ссылки друг на друга.
Работает он примерно так:
setFragmentResultListener("requestKey") { key, bundle ->
val result = bundle.getString("name")
// Do something with the result...
}А в том месте, где мы хотим отправить информацию нужно вызвать:
tvSave.setOnClickListener {
setResult("requestKey", bundleOf("name" to updatedValue))
}Точно такого же слушателя мы можем добавить и для
childfragmentmanager. В целом, новое API выглядит гораздо интереснее предыдущего и виден явный прогресс.