Какие способы создания фрагмента и передачи параметров существуют
Что проверяют
Понимаете ли вы, что фрагмент пересоздаёт система, и поэтому параметры обязаны пережить поворот экрана и смерть процесса. Следом обычно спрашивают, как вернуть результат из фрагмента обратно.
Как отвечать
- пустой конструктор: после поворота или восстановления процесса
FragmentManagerсоздаёт фрагмент заново через рефлексию. Параметры в конструктор не передают; если нужны зависимости, подключаютFragmentFactoryили Hilt; - аргументы:
Bundleвarguments, обычно черезnewInstance()вcompanion objectсbundleOf("id" to id). Читают черезrequireArguments().getLong("id"); - добавление кодом:
supportFragmentManager.commit { setReorderingAllowed(true); add<DetailsFragment>(R.id.container, args = bundleOf(...)) }из fragment-ktx; - добавление в разметке:
FragmentContainerViewсandroid:name, тег<fragment>устарел; - Navigation Component: аргументы описаны в графе, Safe Args генерирует
DetailsFragmentArgsи делегатby navArgs(). Начиная с Navigation 2.8 маршруты можно задавать типобезопасно через Kotlin Serialization и читать черезtoRoute(); - ViewModel: аргументы фрагмента автоматически попадают в
SavedStateHandleего ViewModel, пробрасывать их вручную не нужно.
Обратно результат отдают через Fragment Result API: setFragmentResult("pick", bundleOf(...)) в одном фрагменте и setFragmentResultListener("pick") в другом. Для постоянного общего состояния подходит общая ViewModel через activityViewModels(). setTargetFragment объявлен устаревшим.
Где спотыкаются
Передают данные через конструктор с параметрами или сеттер после создания. До первого поворота всё работает, потом поле пустое или приложение падает с InstantiationException.
Кладут в Bundle большие списки или картинки. Буфер транзакций Binder ограничен примерно 1 МБ на процесс, и при сохранении состояния прилетает TransactionTooLargeException. Передают идентификатор, а данные берут из репозитория.
Связывают фрагменты напрямую: кастуют activity as Listener или держат ссылку на соседний фрагмент. Это жёсткая связность и утечки после пересоздания, современный путь: Fragment Result API и общая ViewModel.