Как исправить некорректную анимацию поп-навигации? - PullRequest
1 голос
/ 04 июня 2019

При использовании хост-компонента навигации Jetpack у меня возникает проблема с навигацией «Поведение всплывающих окон», использующей анимацию, отличную от той, которую я хотел бы, и я не уверен, как вызвать другую.

enter image description here При перемещении между экранами я пытаюсь заставить их «течь справа налево», аналогично навигации в iOS.Однако, когда я добавляю всплывающее поведение, чтобы Fragment 3 возвращалось прямо к Fragment 1, при переходе от Fragment 2 к Fragment 3 Fragment 2 перемещалось вправо, а не влево.

Я воспроизвел проблему в этом хранилище: https://github.com/AtomicSimon/Android-Replication-Screen-Flow

Вот простой экранный поток, который я использую:

Вот график навигации XML:


    <fragment
        android:id="@+id/fragment_1"
        android:label="fragment_fragment_1"
        android:name="com.example.android_replication_screen_flow.fragment_1"
        tools:layout="@layout/fragment_fragment_1">
        <action
            android:id="@+id/action_fragment_1_to_fragment_2"
            app:destination="@id/fragment_2"
            app:enterAnim="@anim/slide_in_from_the_right"
            app:exitAnim="@anim/slide_out_to_the_left"
            app:popEnterAnim="@anim/slide_in_from_the_left"
            app:popExitAnim="@anim/slide_out_to_the_right"/>
    </fragment>
    <fragment
        android:id="@+id/fragment_2"
        android:label="fragment_fragment_2"
        android:name="com.example.android_replication_screen_flow.fragment_2"
        tools:layout="@layout/fragment_fragment_2">
        <action
            android:id="@+id/action_fragment_2_to_fragment_3"
            app:destination="@id/fragment_3"
            app:enterAnim="@anim/slide_in_from_the_right"
            app:exitAnim="@anim/slide_out_to_the_left"
            app:popEnterAnim="@anim/slide_in_from_the_left"
            app:popExitAnim="@anim/slide_out_to_the_right"
            app:popUpTo="@+id/fragment_2"
            app:popUpToInclusive="true"/>
    </fragment>
    <fragment
        android:id="@+id/fragment_3"
        android:label="fragment_fragment_3"
        android:name="com.example.android_replication_screen_flow.fragment_3"
        tools:layout="@layout/fragment_fragment_3"/>

Я бы хотел, чтобы Fragment 2 покинул экран влево при переходе от Fragment 2 к Fragment 3, но я не могу сделать это правильно.

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Чтобы выполнить эту работу, вы должны сделать следующее:

i.) Удалить "popUpTo" из действия "@ + id / action_fragment_2_to_fragment_3"

ii.) Добавить новыйдействие для фрагмента_3, который переходит обратно к фрагменту_1 и очищает backstack для вас

<fragment
    android:id="@+id/fragment_3"
    android:label="fragment_fragment_3"
    android:name="com.example.android_replication_screen_flow.fragment_3"
    tools:layout="@layout/fragment_fragment_3">

    <action
        android:id="@+id/backToFragment_1_action"
        app:destination="@id/fragment_1"
        app:enterAnim="@anim/enter_from_left"
        app:exitAnim="@anim/exit_to_right"
        app:popUpToInclusive="true"
        app:popUpTo="@id/fragment_1" />

</fragment>

iii.), чтобы иметь такое же поведение, когда пользователь нажимает кнопку возврата, необходимо добавить OnBackPressedCallback в onCreate ()Fragment_3 и вызовите "backToFragment_1_action".

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // This callback will only be called when MyFragment is at least Started.
    requireActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
        @Override
        public void handleOnBackPressed() {
            NavHostFragment.findNavController(Fragment_3.this).navigate(R.id. backToFragment_1_action);
        }
    });
}
0 голосов
/ 17 июня 2019

У меня была такая же проблема.

То, что я сделал, было

  • Не используйте popUpTo
  • Выполните действие, а не просто используйте задний стек, используя popUpToInclusive.

Лично я думаю, что это ошибка в навигации с некоторыми анимациями.

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