Добавление пользовательских анимаций перехода в настройки нижней навигации с помощью навигации Jetpack - PullRequest
0 голосов
/ 24 января 2019

Я работаю над приложением, использующим компоненты Jetpack.Я прошил нижнюю навигацию тремя фрагментами, как описано в руководстве .Однако я не могу понять, как изменить анимацию перехода при переключении между фрагментами при нажатии соответствующей навигационной кнопки.

Насколько я знаю, существует два способа создания переходов:

  • Передавая их как опции в navigate(), который в этом случае явно не вызывается;
  • Использование действия с атрибутами анимации, но не знаю, как указать навигации использоватьэти действия.Может быть, сработало бы присвоение ему определенного идентификатора?

Так как мне установить настраиваемую анимацию перехода, не отказываясь от использования BottomNavigation.setupWithNavController(navController)

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

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

0 голосов
/ 08 марта 2019

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

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

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

    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>

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

Приветствия:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...