#android #kotlin #fragment
#Android #kotlin #фрагмент
Вопрос:
Итак, у меня есть такой фрагмент:
class MyFragment(val thing: SomeDataObject) : Fragment {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// do stuff using `thing`
}
}
И я создаю и прикрепляю его следующим образом:
val myFragment = MyFragment(SomeDataObject())
supportFragmentManager.beginTransaction()
.replace(R.id.contentFrame, myFragment)
.commit()
Где я беру переменную thing
в качестве параметра — это, кажется, работает, однако все, что я читал о передаче аргументов фрагментам, говорит о том, чтобы сделать это, создав пакет и установив arguments
его в экземпляре фрагмента.
Есть ли что-то неправильное в том, чтобы делать это так, как я определил выше, или какая-то польза от использования пакетов вместо этого?
Просто любопытно, почему везде предлагается использовать, казалось бы, более сложные способы передачи аргументов…
Ответ №1:
Фрагменты должны иметь конструктор с 0 аргументами, чтобы фреймворк мог воссоздать их для вас, например, после изменения конфигурации. Вы получите сбой, если конструктор 0-arg отсутствует. Если у вас есть оба конструктора 0-arg и> 0-arg, любая инициализация, выполняемая в > 0-arg, будет отсутствовать при вызове конструктора 0-arg.
Комментарии:
1. Почему я еще не столкнулся с этой проблемой? Некоторое время я использовал метод, который я определил, и не получил никаких сбоев — могу ли я что-нибудь сделать, чтобы создать проблему, которую вы описали?
2. Поворот экрана — это простой способ вызвать изменение конфигурации.
3. Потрясающее спасибо, смог воспроизвести его — приму ваш ответ, когда мне будет разрешено
Ответ №2:
Android также позволяет установить FragmentFactory, который будет отвечать за создание экземпляров фрагментов.
Использование fragmentFactory обеспечивает необходимую зависимость, особенно когда зависимость не относится к основным типам и может быть помещена в пакет и установлена на фрагменты аргументов.
Это также предотвращает исключение во время выполнения для сценария воссоздания активности (поворот экрана / масштабирование экрана и т. Д.)
Можете посмотреть этот учебник о том, как использовать fragmentFactory для сценария параметризованного конструктора фрагментов.