Ответ
Использование не дефолтного конструктора фрагмента (с параметрами) не рекомендуется, потому что Android может пересоздать фрагмент при повороте экрана или восстановлении состояния. В этом случае система вызовет дефолтный конструктор, а переданные параметры потеряются.
Вместо этого используйте setArguments(Bundle) для передачи данных:
class MyFragment : Fragment() {
companion object {
fun newInstance(param: String): MyFragment {
val args = Bundle().apply { putString("key", param) }
return MyFragment().apply { arguments = args }
}
}
}
Так данные сохранятся при пересоздании фрагмента.
Ответ 18+ 🔞
Ага, слушай, тут такая тема интересная вырисовывается. Вот представь: ты пишешь фрагмент и думаешь — а чего мелочиться, дай-ка я ему в конструктор параметры красиво передам, чтобы сразу с данными был. И вроде всё работает, красота. А потом пользователь экран поворачивает — и тут начинается ёперный театр!
Android-то, хитрая жопа, возьмёт и пересоздаст твой фрагмент заново, но только через дефолтный конструктор, без параметров! И все твои красивые данные, которые ты так любовно передавал, просто накрываются медным тазом. Потерялись, ищи-свищи. Доверия к такому подходу — ноль ебать.
Так какого хуя делать-то? Всё просто, как три копейки. Нужно использовать setArguments(Bundle). Это как специальный карман у фрагмента, куда система сама заглядывает, когда его восстанавливает. Вот смотри, как это выглядит по-пацански:
class MyFragment : Fragment() {
companion object {
fun newInstance(param: String): MyFragment {
val args = Bundle().apply { putString("key", param) }
return MyFragment().apply { arguments = args }
}
}
}
Видишь? Создаёшь статический метод newInstance, внутри него упаковываешь всё, что нужно, в Bundle — это такой контейнер-мешок. И вешаешь этот мешок на фрагмент через arguments. И теперь, когда система будет убивать и возрождать твой фрагмент как феникса, она сама сохранит и восстановит этот Bundle. Данные на месте, все живы, ты не охуел от криков тестировщиков.
А внутри фрагмента потом просто в onCreateView или где тебе надо достаёшь эти данные:
val myParam = arguments?.getString("key") ?: "default"
Вот и вся магия. Никаких самопальных конструкторов, только санкционированные системой пути. И волнение ебать уходит, и терпения не тратится. Работает — пизда рулю.