在正在进行的FragmentTransaction期间更改片段的z顺序

时间:2014-02-04 18:23:30

标签: android android-fragments android-animation fragmenttransaction

有没有办法如何更改正在进行的FragmentTransaction期间显示的片段的z顺序? 我有一个动画,其中两个片段彼此重叠,我想让从右边滑动的片段(第二个片段)显示在另一个向下滑动的片段下面。现在它们在交易期间以相反的顺序显示。

以下是我的一个动画的代码:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
 android:duration="400"
 android:zAdjustment="bottom">
<scale android:toXScale="1"
    android:fromXScale="0.9"
    android:pivotX="50%p"
    android:pivotY="50%p"
    android:toYScale="1"
    android:startOffset="300"
    android:fromYScale="0.9"/>
<translate android:fromXDelta="50%p"
    android:interpolator="@android:interpolator/overshoot"
    android:toXDelta="0"/>

</set>

以下是交易代码

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.show(fragmentToShow).hide(fragmentToHide).commit();

我希望fragmentToHide显示在fragmentToShow下方。 我试图解决android:zAdjustment属性,但因为它显然只适用于窗口动画,所以它对我没用。

2 个答案:

答案 0 :(得分:3)

我也有这个问题,我能找到的唯一解决方法是将另一个FrameLayout直接放在保存当前片段的框架下。然后我将我的新片段转换为备用FrameLayout(它具有比它下面的FrameLayout更高的z顺序)并从同一事务中的原始FrameLayout中删除旧片段。像这样:

<FrameLayout
    android:id="@+id/video_list_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</FrameLayout>

<FrameLayout
    android:id="@+id/video_player_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</FrameLayout>

是的,我知道这会为层次结构添加一个额外的视图,但它不会增加树的深度。为了提高性能,我在我的片段中重写onCreateAnimator,将动画卸载到硬件层,如下所示:

@Override
public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
    Animator animation = super.onCreateAnimator(transit, enter, nextAnim);

    // HW layer support only exists on API 11+
    if (Build.VERSION.SDK_INT >= 11) {
        if (animation == null && nextAnim != 0) {
            animation = AnimatorInflater.loadAnimator(getActivity(), nextAnim);
        }

        if (animation != null) {
            animation.addListener(new LayerEnablingAnimatorListener(getView()));
        }
    }

    return animation;
}

这是LayerEnablingAnimatorListener:

public class LayerEnablingAnimatorListener extends AnimatorListenerAdapter {

    private final View mTargetView;
    private int mLayerType;

    public LayerEnablingAnimatorListener(View targetView) {
        mTargetView = Objects.requireNonNull(targetView, "Target view cannot be null");
    }

    public View getTargetView() {
        return mTargetView;
    }

    @Override
    public void onAnimationStart(Animator animation) {
        super.onAnimationStart(animation);
        mLayerType = mTargetView.getLayerType();
        mTargetView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    }

    @Override
    public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
        mTargetView.setLayerType(mLayerType, null);
    }
}

答案 1 :(得分:0)

在您的网络片段中使用ViewCompat.setTranslationZ()和以下内容

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    ViewCompat.setTranslationZ(getView(), 1f);
}

默认trasnlationZ为0。