使用Jetpack导航将自定义过渡动画添加到底部导航设置

时间:2019-01-24 10:44:58

标签: android android-layout navigation android-jetpack android-architecture-navigation

我正在使用jetpack组件开发应用程序。如guide所述,我用三个片段拼接了底部导航。但是,当按相应的导航按钮在片段之间切换时,我不知道如何更改过渡动画。

据我所知,创建过渡有两种方法:

  • navigate()中将它们作为选项传递,在这种情况下没有明确调用;
  • 使用具有动画属性的动作,但不知道如何告诉导航使用这些动作。也许给它一个特定的ID是行得通的吗?

因此,如何设置自定义过渡动画而不必放弃使用BottomNavigation.setupWithNavController(navController)

2 个答案:

答案 0 :(得分:1)

我认为您不能,但是会对解决方案感兴趣。

如果有帮助,这里是一种解决方法:

不要将底部导航与导航控制器绑定在一起(不要按照指南中的指示进行操作)。像这样设置处理程序,自己管理过渡:

    bottomNav!!.setOnNavigationItemSelectedListener { item ->
        selectFragment(item)
        false
    }

然后在每个片段之间创建过渡,并在处理程序中自行管理它们。这是3的示例:

private fun selectFragment(item: MenuItem) {
    if (selectedItem == -1)
        navController.navigate(item.itemId)
    else
        navController.navigate(
                when (item.itemId) {
                    R.id.interviewsFragment ->
                        if (selectedItem == R.id.personsFragment)
                            R.id.action_personsFragment_to_interviewsFragment
                        else
                            R.id.action_questionListsFragment_to_interviewsFragment
                    R.id.personsFragment ->
                        if (selectedItem == R.id.interviewsFragment)
                            R.id.action_interviewsFragment_to_personsFragment
                        else
                            R.id.action_questionListsFragment_to_personsFragment
                    R.id.questionListsFragment ->
                        if (selectedItem == R.id.interviewsFragment)
                            R.id.action_interviewsFragment_to_questionListsFragment
                        else
                            R.id.action_personsFragment_to_questionListsFragment
                    else -> item.itemId
                })

    selectedItem = item.itemId


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

在导航图中定义动画。这是一个包含3个片段的示例,动画朝着被选中的项目移动,使它感觉自然:

<fragment
    android:id="@+id/interviewsFragment"
    android:name="com.unludo.interview.interview.list.InterviewsFragment"
    android:label="InterviewsFragment" >
    <action
        android:id="@+id/action_interviewsFragment_to_personsFragment"
        app:destination="@id/personsFragment"
        app:enterAnim="@anim/enter_from_right"
        app:exitAnim="@anim/exit_to_left" />
    <action
        android:id="@+id/action_interviewsFragment_to_questionListsFragment"
        app:destination="@id/questionListsFragment"
        app:enterAnim="@anim/enter_from_right"
        app:exitAnim="@anim/exit_to_left" />
</fragment>
<fragment
    android:id="@+id/personsFragment"
    android:name="com.unludo.interview.persons.list.PersonsFragment"
    android:label="PersonsFragment" >
    <action
        android:id="@+id/action_personsFragment_to_interviewsFragment"
        app:destination="@id/interviewsFragment"
        app:enterAnim="@anim/enter_from_left"
        app:exitAnim="@anim/exit_to_right" />
    <action
        android:id="@+id/action_personsFragment_to_questionListsFragment"
        app:destination="@id/questionListsFragment"
        app:enterAnim="@anim/enter_from_right"
        app:exitAnim="@anim/exit_to_left" />
</fragment>
<fragment
    android:id="@+id/questionListsFragment"
    android:name="com.unludo.interview.questions.lists.QuestionListsFragment"
    android:label="QuestionListsFragment" >
    <action
        android:id="@+id/action_questionListsFragment_to_personsFragment"
        app:destination="@id/personsFragment"
        app:enterAnim="@anim/enter_from_left"
        app:exitAnim="@anim/exit_to_right" />
    <action
        android:id="@+id/action_questionListsFragment_to_interviewsFragment"
        app:destination="@id/interviewsFragment"
        app:enterAnim="@anim/enter_from_left"
        app:exitAnim="@anim/exit_to_right" />
</fragment>

我认为这种行为可以由组件本身来管理,但就目前而言,我认为我们必须手动进行管理。

干杯:)

答案 1 :(得分:0)

我相信您可以通过创建R.anim.nav_default_ [Enter / Exit / PopEnter / PopExit]动画文件的版本并将它们放置在动画资源目录中来实现此行为。然后,组件将这些文件用于默认动画。感觉它不应该那样工作,但目前可以。