Boy
Boy

Reputation: 7497

fragments, android:zAdjustment (z order) and animations

I'm using the support library. Now, I want to have a fragment shifting in from the bottom, moving OVER the previous one.

For this I use this to keep the previous fragment (the one that is being slided over) visible until the new fragment is in its place:

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
   android:fromAlpha="1.0" android:toAlpha="1.0" 
   android:duration="2500"
   android:zAdjustment="bottom" />

this is animation used for the new fragment to slide in from bottom:

<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="100%p" android:toYDelta="0"
        android:duration="@android:integer/config_mediumAnimTime" 
        android:zAdjustment="top"/>

I've put the z adjustment to bottom and top for both, but still the 'bottom' animation is still on top of the new fragment! I have put the duration to 2500 for testing and it stays on top for the whole time.

Does zAdjustment not work for fragment animations?

Upvotes: 25

Views: 8741

Answers (4)

Nexen
Nexen

Reputation: 1892

You can use androidx.fragment.app.FragmentContainerView as a fragments container. It automatically handles z order for animations specified in setCustomAnimations()

Upvotes: 1

barnabus
barnabus

Reputation: 882

You can override the onCreateAnimation method and for any animations you can check what animation is currently running and if you need it to be on top, set the Z-axis from there.

override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? {
    if (nextAnim == R.anim.enter_from_right || nextAnim == R.anim.exit_to_right) {
        ViewCompat.setTranslationZ(view, 1f)
    } else {
        ViewCompat.setTranslationZ(view, 0f)
    }

    return super.onCreateAnimation(transit, enter, nextAnim)
}

Recommend implementing this as a base Fragment class for all your fragments.

Upvotes: 7

amukhachov
amukhachov

Reputation: 5900

I've also got stuck with that problem. So instead of using transaction.replace(containerId, newFragment) I've created two containers for fragments and now my code looks like this one

Add first fragment:

transaction.add(containerId1, firstFragment).commit();

Add second fragment with animation over the first one:

findViewById(containerId2).bringToFront();
transaction.setCustomAnimations(R.anim.slide_in_up,
 R.anim.stay).remove(oldFragment).add(containerId2, newFragment).commit()

Upvotes: 4

Marius
Marius

Reputation: 1073

According to this google group thread Z adjustment only works for window animations.

"The Z adjustment only works for window animations. I thought this was documented, but apparently not." -- Dianne Hackborn (Android framework engineer)

Upvotes: 9

Related Questions