有没有办法如何更改正在进行的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
属性,但因为它显然只适用于窗口动画,所以它对我没用。
答案 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。