Intereting Posts

Изменение z-порядка фрагментов во время текущего FragmentTransaction

Есть ли способ изменить z-порядок, в котором отображаются фрагменты во время текущего FragmentTransaction? У меня есть анимация, где оба фрагмента перекрываются друг с другом, и я хотел бы, чтобы фрагмент, который скользит справа (второй фрагмент), отображается под другим, который скользит влево. Сейчас они отображаются в противоположном порядке во время транзакции.

Вот код одной из моих анимаций:

<?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 , но поскольку он, по-видимому, работает только для анимации окон, он просто не работал для меня.

Solutions Collecting From Web of "Изменение z-порядка фрагментов во время текущего FragmentTransaction"

У меня также была эта проблема, и единственным обходным решением, которое я смог найти, является размещение другого FrameLayout непосредственно под тем, который содержит текущий фрагмент. Затем я переношу свой новый фрагмент в альтернативный FrameLayout (который имеет более высокий порядок z, чем FrameLayout под ним) и удаляет старый фрагмент из исходного 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); } } 

Используйте ViewCompat.setTranslationZ() и следующее в вашем фрагменте сети

 @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ViewCompat.setTranslationZ(getView(), 1f); } 

По умолчанию trasnlationZ равен 0.