Добавление настраиваемой анимации перехода в настройку нижней навигации с навигацией на реактивном ранце


comment
Вы нашли решение?   -  person Francesco Bonizzi    schedule 20.08.2020


Ответы (2)


Я думаю, вы не можете, но было бы интересно найти решение.

Вот обходной путь, если это поможет:

Не связывайте нижнюю навигационную панель с навигационным контроллером (не делайте того, что указано в руководстве). Управляйте переходом самостоятельно, установив обработчик следующим образом:

    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>

Я думаю, что этим поведением можно управлять с помощью самого компонента, но пока я думаю, что мы должны управлять руками.

Ваше здоровье :)

person unludo    schedule 08.03.2019

Я считаю, что вы можете добиться такого поведения, создав версии файлов анимации R.anim.nav_default_ [Enter / Exit / PopEnter / PopExit] и поместив их в каталог ресурсов анимации. Компонент будет использовать эти файлы для анимации по умолчанию. Такое ощущение, что так работать не должно, но на данный момент это работает.

person Garry McKee    schedule 15.04.2019
comment
Не знаю почему, но у меня это не работает. Я создал четыре файла R.anim.nav_default_enter, R.anim.nav_default_exit, R.anim.nav_default_pop_enter, R.anim.nav_default_pop_exit, но это ничего не меняет? - person Andrew; 17.03.2021