Как создать анимаированные переходы между фрагментами в Bottom Navigation?

Насколько я понял, нет простого способа седлать плавные переходы между фрагментами при использовании Navigation Component + BottomNavigationBar. По крайней мере, способ, описанный в официальной гайде не поддерживает такое. Я наткнулся на похожий вопрос на StackOverflow, но он тоже не особо помог. Я попробовал сделать то, что там предлагалось, но вылетает ошибка:

java.lang.IllegalArgumentException: Navigation action/destination com.example.banktask3:id/action_newsFragment_to_friendsFragment cannot be found from the current destination Destination(com.example.banktask3:id/friendsFragment) label=fragment_friends class=com.example.banktask3.presentation.friends.FriendsFragment

Предположу, что дело в то, что приложение не знает, какой фрагмент открыт в данный момент. Я пытался использовать привязку к выбранному пункту BottomNavigation, использую параметр binding.bottomNavView.selectedItemId, но он всё так же не помогает. В чем тут дело и как мне это пофиксить? Предположу, что мне нужно получить из MainActivity текущий фрагмент, затем проверять, какой фрагмент текущий и в зависимости от этого выбирать, какое действие по переходу между фрагментами совершать. Но как получить из активити текущий фрагмент?

class MainActivity : AppCompatActivity() {
    private lateinit var navController: NavController
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        setNavigation()
    }

    private fun setNavigation(){
        val navHostFragment =
            supportFragmentManager.findFragmentById(R.id.fragment_container_view) as NavHostFragment
        navController = navHostFragment.navController
        binding.bottomNavView.setOnNavigationItemSelectedListener { item ->
            selectFragment(item)
            false
        }
    }

    private fun selectFragment(item: MenuItem) {
        if (binding.bottomNavView.selectedItemId == -1)
            navController.navigate(item.itemId)
        else
            navController.navigate(
                when (item.itemId) {
                    R.id.newsFragment ->
                        if (binding.bottomNavView.selectedItemId == R.id.friendsFragment)
                            R.id.action_friendsFragment_to_newsFragment
                        else
                            R.id.action_groupsFragment_to_newsFragment
                    R.id.friendsFragment ->
                        if (binding.bottomNavView.selectedItemId == R.id.groupsFragment)
                            R.id.action_groupsFragment_to_friendsFragment
                        else
                            R.id.action_newsFragment_to_friendsFragment
                    R.id.groupsFragment ->
                        if (binding.bottomNavView.selectedItemId == R.id.newsFragment)
                            R.id.action_newsFragment_to_groupsFragment
                        else
                            R.id.action_friendsFragment_to_groupsFragment
                    else -> item.itemId
                })

        binding.bottomNavView.selectedItemId = item.itemId


        // uncheck the other items.
        for (i in 0 until binding.bottomNavView!!.menu.size()) {
            val menuItem = binding.bottomNavView!!.menu.getItem(i)
            if (menuItem.itemId == item.itemId) menuItem.isChecked = true
        }
    }

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