0

I have been using the Jetpack Navigation component (2.3.5, although I have tested older versions too) and trying to add transitions between two simple destinations. However, the transition specified with the popEnterAnim attribute doesn't run at all. Instead the re-entering fragment just immediately appears.

I have managed to recreate it with a really simple example. The fragment layouts are just a single TextView.

Main activity

<androidx.fragment.app.FragmentContainerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:defaultNavHost="true"
    app:navGraph="@navigation/nav_graph" />
class ActivityMain : AppCompatActivity(R.layout.main)

Fragment 1

class Fragment1 : Fragment(R.layout.fragment_1) {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

        view.setOnClickListener {

            findNavController().navigate(R.id.action_fragment1_to_fragment2)
        }
    }
}

Fragment 2

class Fragment2: Fragment(R.layout.fragment_2)

Navigation graph

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/nav_graph.xml"
    app:startDestination="@id/fragment1">

    <fragment
        android:id="@+id/fragment1"
        android:name="uk.henrytwist.projectsource.Fragment1"
        android:label="MainFragment" >
        <action
            android:id="@+id/action_fragment1_to_fragment2"
            app:destination="@id/fragment2"
            app:enterAnim="@anim/transition_rise_up_enter"
            app:exitAnim="@anim/transition_fade_exit"
            app:popEnterAnim="@anim/transition_fade_pop_enter"
            app:popExitAnim="@anim/transition_rise_up_pop_exit" />
    </fragment>
    <fragment
        android:id="@+id/fragment2"
        android:name="uk.henrytwist.projectsource.Fragment2"
        android:label="Fragment2" />
</navigation>
Henry Twist
  • 5,666
  • 3
  • 19
  • 44
  • I faced this issue some time ago for a particular action/fragment and not in all devices, mostly for old ones.. The problem was that the fragment had some tasks that lags the main UI, although they didn't seem like that much, but once moving them in worker thread, the transition started to work – Zain Apr 25 '21 at 00:01
  • Thanks for the response @Zain, unfortunately the example I have posted in the question is literally the example I am having a problem with. It is a brand new project without any other code (apart from the fragment layout files), so there's no work being done at all aside from rendering a single TextView. – Henry Twist Apr 25 '21 at 00:20
  • Can you try to [set it programmatically](https://stackoverflow.com/questions/51856988/navigation-component-set-transition-animation-programmatically) and see .. Also please make sure that you use the latest version of dependency – Zain Apr 25 '21 at 00:47
  • Just tried it programmatically @Zain, unfortunately I get the same results. All the transitions work if they're set individually, apart from pop enter. – Henry Twist Apr 25 '21 at 13:57

1 Answers1

4

It turns out that this was actually due to a bug in the AndroidX fragment library (androidx.fragment:fragment:1.3.2) which has now been rectified in version 1.3.3. The changelog confirms the fix:

Fixed a regression introduced in Fragment 1.3.2 which would cause popEnter animations to not run when popping a FragmentTransaction that included a setPrimaryNavFragment operation, such as those used by NavHostFragment. (I38c87, b/183877426)

Henry Twist
  • 5,666
  • 3
  • 19
  • 44