Домашнее задание фрагменты#62
Домашнее задание фрагменты#62uatilman wants to merge 10 commits intoAndroid-Developer-Basic:masterfrom
Conversation
| } | ||
| with(binding) { | ||
| fragmentAAButton.setOnClickListener { | ||
| parentFragmentManager.beginTransaction() |
There was a problem hiding this comment.
Код работает, потому что view FragmentA уже в иерархии активити, и parentFragmentManager находит fragment_a_container. По заданию FragmentAA должен быть child фрагментом, поэтому используем childFragmentManager. Это создает правильную иерархию, корректный lifecycle и отдельный back stack для дочерних фрагментов, что важно при поворотах и навигации
ActivityA
|
FragmentA (supportFragmentManager)
|
FragmentAA (childFragmentManager FragmentA)
|
FragmentAB (childFragmentManager FragmentA)
| } | ||
| with(binding) { | ||
| fragmentABButton.setOnClickListener { | ||
| parentFragmentManager.beginTransaction() |
There was a problem hiding this comment.
А тогда FragmentAB будет же child от фрагмента FragmentAA, а по заданию он должен быть child от FragmentA?
Проверил по hash FragmentManager. childFragmentManager в FragmentA совпадает по hash c parentFragmentManager в FragmentAA.
There was a problem hiding this comment.
@uatilman Юрий, вы правы! АА у нас через чайлд, а для АВ уже перент. Затроили меня буквенные фрагменты.
|
|
||
| val onBackPressedCallback = object : OnBackPressedCallback(true) { | ||
| override fun handleOnBackPressed() { | ||
| val backStackEntryCount = parentFragmentManager.backStackEntryCount |
There was a problem hiding this comment.
Лучше считать childFragmentManager.backStackEntryCount и не добавлять корневой FragmentA в backStack активити. Когда в стеке дочерних фрагментов остается только FragmentA (размер = 1), закрываем активити
| private lateinit var fragmentBA: FragmentBA | ||
| private lateinit var fragmentBB: FragmentBB | ||
|
|
||
| private val isTablet by lazy { resources.getBoolean(R.bool.is_tablet) } |
There was a problem hiding this comment.
По заданию разделение должно быть по ориентации экрана (landscape/portrait), а не по размеру устройства. Проверяем resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
|
|
||
| parentFragmentManager.beginTransaction() | ||
| .replace(R.id.fragment_b_a_container, fragmentBB) | ||
| .commit() |
There was a problem hiding this comment.
Когда FragmentBB отправляет цвет обратно, FragmentBA может быть не готов его принять. Также пользователь не может вернуться к FragmentBA. Добавьте транзакцию в backStack через addToBackStack(null), чтобы FragmentBA сохранялся и мог получить результат.
| binding.root.setBackgroundColor(color) | ||
| } | ||
|
|
||
| binding.fragmentBBButton?.setOnClickListener { |
There was a problem hiding this comment.
В портретной разметке FragmentBB отсутствует кнопка, хотя код ожидает ее. Из-за этого пользователь не может отправить цвет в FragmentBA
| override fun onViewCreated(view: View, savedInstanceState: Bundle?) { | ||
| super.onViewCreated(view, savedInstanceState) | ||
|
|
||
| setFragmentResultListener(COLOR_RESULT_KEY_BA_TO_BB) { _, bundle -> |
There was a problem hiding this comment.
По заданию FragmentBB должен только отправлять цвет в FragmentBA, а не получать. Немного запутались с реализацией :)
Домашнее задание реализовано полностью