Я столкнулся с проблемой пользовательских анимаций в транзакции 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);
}