Могу ли я поместить аргументы в мой конструктор фрагментов

#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 для сценария параметризованного конструктора фрагментов.