Правильно ли в 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()
}

Ответы (0 шт):