Как мы можем анимировать переход фрагмента navigateUp ()? - PullRequest
0 голосов
/ 15 февраля 2020

При выполнении транзакций фрагментов, которые являются частью системы androidx.navigation, мы можем программно указывать NavOptions следующим образом:

val navOptions = NavOptions.Builder()
        .setEnterAnim(R.anim.slide_in_right)
        .build()
    findNavController(R.id.nav_host_fragment).navigate(R.id.settingsFragment, null, navOptions)

Мы также можем указывать их в навигации. xml следующим образом:

 <fragment
        android:id="@+id/settingsFragment"
        android:name="com.test.android.fragments.SettingsFragment"
        android:label="SettingsFragment">

        <action
            android:id="@+id/action_settings_to_profile"
            app:destination="@id/userProfileSettingsFragment"
            app:enterAnim="@anim/slide_in_right" />

</fragment>

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

Как анимировать: navigateUp ()? Он вызывает popBackStackInternal внутри, что является сложной операцией. Я не вижу логики c, имеющей отношение к анимации.

Какие-нибудь альтернативные решения для возврата туда, откуда вы пришли с анимацией, кроме navigateUp ()?

1 Ответ

1 голос
/ 15 февраля 2020

Вы можете использовать атрибуты popEnterAnim и popExitAnim, например:

 <fragment
    android:id="@+id/settingsFragment"
    android:name="com.storefaces.android.fragments.SettingsFragment"
    android:label="SettingsFragment">

    <action
        android:id="@+id/action_settings_to_profile"
        app:destination="@id/userProfileSettingsFragment"
        app:enterAnim="@anim/slide_in_right"
        app:exitAnim="@anim/slide_out_right"
        app:popEnterAnim="@anim/slide_in_left"
        app:popExitAnim="@anim/slide_out_left" />

</fragment>

В качестве альтернативы вы можете вызывать методы setPopEnterAnim() и setPopExitAnim() для NavOptions.Builder

val navOptions = NavOptions.Builder()
    .setEnterAnim(R.anim.slide_in_right)
    .setExitAnim(R.anim.slide_out_right)
    .setPopEnterAnim(R.anim.slide_in_left)
    .setPopExitAnim(R.anim.slide_out_left)
    .build()

findNavController(R.id.nav_host_fragment).navigate(R.id.settingsFragment, null, navOptions)
...