Правильно ли в Android писать весь код навигации в activity при использовании Fragment и выделении Router?
Правильно ли писать весь код навигации в приложении в activity при использовании такого подхода?
Реализую навигацию в приложении на FragmentManager стандартным путем, без использования Jetpack Navigation component.
Хочу именно с FragmentManager хорошо разобраться. Решил выделить интерфейс Router и в нем описать свои route. Видел давно, что так делают, но не нашел пример, как ни старался нагуглить(
И теперь написав пример, меня смущает, что я буду с каждым новым экраном раздувать свой activity. Да и activity начинает походить на старый добрый GodObject. А если оставлять логику навигации фрагментов и управление стрелкой назад в toolbar то фрагменты уже должны будут знать о activity. А ведь они ничего не должны знать о ней по хорошему, в этом их смысл же.
Не правильно ли будет выделить еще какой-то класс который будет реализовывать эту навигацию?
В своей реализации выделил интерфейс Router и extension, для удобного использования в Fragment:
fun Fragment.router(): Router {
return requireActivity() as Router
}
interface Router {
fun routeToDetailFragment()
fun routeToListFragment()
fun routeToMainFragment()
}
В моей MainActivity, я имплементирую интерфейс Router. Пример метода:
override fun routeToListFragment() {
supportFragmentManager.beginTransaction()
.replace(
R.id.fragmentContainer, ListFragment()
).addToBackStack(null)
.commit()
}
Так же в MainActivity определяю FragmentLifecycleCallbacks
private val fragmentListener = object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentViewCreated(
fm: FragmentManager, f: Fragment, v: View, savedInstanceState: Bundle?
) {
super.onFragmentViewCreated(fm, f, v, savedInstanceState)
showUpButton()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
supportFragmentManager.registerFragmentLifecycleCallbacks(fragmentListener, true)
super.onCreate(savedInstanceState)
...
}
override fun onDestroy() {
supportFragmentManager.unregisterFragmentLifecycleCallbacks(fragmentListener)
super.onDestroy()
}
И при смене фрагментов в методе showUpButton() я уже решаю показывать мне стрелку назад или нет в моём toolBar(Его я взял Material Tool Bar)
private fun showUpButton() {
if (supportFragmentManager.backStackEntryCount > 0) {
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
} else {
supportActionBar?.setDisplayHomeAsUpEnabled(false)
supportActionBar?.setDisplayShowHomeEnabled(false)
}
}
И переопределяю onSupportNavigateUp():Boolean, что бы работала стрелка назад
override fun onSupportNavigateUp(): Boolean {
onBackPressedDispatcher.onBackPressed()
return true
}
В Fragment, по нажатию на кнопку в setOnclickListener я делаю:
binding?.listToMain?.setOnClickListener {
router().routeToMainFragment()
}