SupportFragmentManager Транзакция с пользовательской ошибкой анимации - PullRequest
0 голосов
/ 29 сентября 2018

Я столкнулся с проблемой пользовательских анимаций в транзакции SupportFragmentManager при переключении фрагментов.Код, который я использую, работал с устаревшим FragmentManager, но, учитывая, что он устарел в Android P, я использую версию поддержки.

val ft = supportFragmentManager.beginTransaction()
ft.setCustomAnimations(animationIn, animationOut)
ft.hide(mCurrentFragment!!)
ft.show(f)
ft.commit()
mCurrentFragment = f

Ошибка - NPE, когда скрывается пользовательская анимацияуказано:

Причина: java.lang.NullPointerException
в android.support.v4.app.FragmentManagerImpl.completeShowHideFragment (FragmentManager.java:1725)

Я попытался установить animationOut в 0, чтобы заставить его работать, но переход фрагмента выглядит не так хорошо.

Обновление: это элементы анимации:

animationIn

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together" >
    <objectAnimator
        android:interpolator="@android:interpolator/accelerate_cubic" 
        android:propertyName="x"
        android:duration="300"
        android:valueType="floatType"
        android:valueFrom="-500"
        android:valueTo="0"
        android:startOffset="300" />

    <objectAnimator
        android:propertyName="alpha"
        android:duration="300"
        android:valueType="floatType"
        android:valueFrom="0.3"
        android:valueTo="1"
        android:startOffset="300" />
</set>

animationOut

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together" >
    <objectAnimator
        android:propertyName="alpha"
        android:duration="300"
        android:valueType="floatType"
        android:valueFrom="1"
        android:valueTo="0"
        android:startOffset="0"/>
</set>

Кто-нибудь сталкивался с этой проблемой?Спасибо.

Это часть класса FragmentManagerImpl, в которой возникает ошибка:

void completeShowHideFragment(final Fragment fragment) {
    if(fragment.mView != null) {
        FragmentManagerImpl.AnimationOrAnimator anim = this.loadAnimation(fragment, fragment.getNextTransition(), !fragment.mHidden, fragment.getNextTransitionStyle());
        if(anim != null && anim.animator != null) {
            anim.animator.setTarget(fragment.mView);
            if(fragment.mHidden) {
                if(fragment.isHideReplaced()) {
                    fragment.setHideReplaced(false);
                } else {
                    final ViewGroup container = fragment.mContainer;
                    final View animatingView = fragment.mView;
                    // --- the NPE error occurs here
                    container.startViewTransition(animatingView);
                    anim.animator.addListener(new AnimatorListenerAdapter() {
                        public void onAnimationEnd(Animator animation) {
                            container.endViewTransition(animatingView);
                            animation.removeListener(this);
                            if(fragment.mView != null) {
                                fragment.mView.setVisibility(8);
                            }

                        }
                    });
                }
            } else {
                fragment.mView.setVisibility(0);
            }

            setHWLayerAnimListenerIfAlpha(fragment.mView, anim);
            anim.animator.start();
        } else {
            if(anim != null) {
                setHWLayerAnimListenerIfAlpha(fragment.mView, anim);
                fragment.mView.startAnimation(anim.animation);
                anim.animation.start();
            }

            int visibility = fragment.mHidden && !fragment.isHideReplaced()?8:0;
            fragment.mView.setVisibility(visibility);
            if(fragment.isHideReplaced()) {
                fragment.setHideReplaced(false);
            }
        }
    }

    if(fragment.mAdded && fragment.mHasMenu && fragment.mMenuVisible) {
        this.mNeedMenuInvalidate = true;
    }

    fragment.mHiddenChanged = false;
    fragment.onHiddenChanged(fragment.mHidden);
}
...