Как создать анимаированные переходы между фрагментами в 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
}
}