Сбой после нажатия кнопки BottomNavigation, когда анимация все еще появляется / исчезает
У меня есть BottomNavigation и 4 фрагмента. Приложение вылетает после того, как я нажимаю на символы BottomNavigation, но только если анимация (постепенное появление / исчезновение) все еще продолжается. Если я отключу анимацию в своем коде, как показано: /setCustomAnimations(R.anim.fade_in, R.anim.fade_out)./ все работает нормально но без анимации конечно. Я бы хотел сохранить анимацию. Как я могу решить эту проблему?
Это мой код BottomNavigation:
public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener {
BottomNavigationView bottomNavigationView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bottomNavigationView = findViewById(R.id.bottom_Navigation_View);
bottomNavigationView.setOnNavigationItemSelectedListener(this);
bottomNavigationView.setSelectedItemId(R.id.navigation_partOne);
}
partOne partOneFragment = new partOne();
partTwo partTwoFragment = new partTwo();
partThree partThreeFragment = new partThree();
partFour partFourFragment = new partFour();
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.navigation_partOne:
getSupportFragmentManager().beginTransaction()./*setCustomAnimations(R.anim.fade_in, R.anim.fade_out).*/replace(R.id.container, partOneFragment).commit();
return true;
case R.id.navigation_partTwo:
getSupportFragmentManager().beginTransaction()./*setCustomAnimations(R.anim.fade_in, R.anim.fade_out).*/replace(R.id.container, partTwoFragment).commit();
return true;
case R.id.navigation_partThree:
getSupportFragmentManager().beginTransaction()./*setCustomAnimations(R.anim.fade_in, R.anim.fade_out).*/replace(R.id.container, partThreeFragment).commit();
return true;
case R.id.navigation_partFour:
getSupportFragmentManager().beginTransaction()./*setCustomAnimations(R.anim.fade_in, R.anim.fade_out).*/replace(R.id.container, partFourFragment).commit();
return true;
}
return false;
}
}
Для полноты картины это мой файл fade_in.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="0"
android:toAlpha="1"
android:duration="300"
android:interpolator="@android:anim/accelerate_interpolator"/>
</set>
Ошибка в Logcat:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.exerciseexample, PID: 17519
java.lang.IllegalStateException: Restarter must be created only during owner's initialization stage
at androidx.savedstate.SavedStateRegistryController.performRestore(SavedStateRegistryController.java:58)
at androidx.fragment.app.Fragment.performCreate(Fragment.java:2585)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:838)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5832)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
compileSdkVersion
29 лет; соответствующая зависимостьimplementation 'androidx.appcompat:appcompat:1.1.0'
: Я уже пробовал понизить эти версии.
Заранее спасибо!
1 ответ
Попробуйте добавить AddToBackStack(null) после setCustomAnimations() для каждого фрагмента.
getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.fade_in,
R.anim.fade_out).AddToBackStack(null).replace(R.id.container,
partOneFragment).commit();
Другое решение, вы можете попробовать изменить версию библиотеки на androidx.appcompat:appcompat:1.0.2.