Я использую BottonNavigationView
в своем приложении, которое переключается между 4 фрагментами. поскольку все фрагменты должны храниться в памяти и не должны создаваться каждый раз при выборе, они создаются и добавляются в контейнер при запуске, а затем в зависимости от того, какой элемент выбран, все фрагменты скрываются и отображается соответствующий фрагмент.
fragment1= Fragment1.newInstance();
fragment2= Fragment2.newInstance();
fragment3= Fragment3.newInstance();
fragment4= Fragment4.newInstance();
getSupportFragmentManager().beginTransaction().add(R.id.main_fragments_holder, fragment1).hide(fragment1).commit();
getSupportFragmentManager().beginTransaction().add(R.id.main_fragments_holder, fragment2).hide(fragment2).commit();
getSupportFragmentManager().beginTransaction().add(R.id.main_fragments_holder, fragment3).hide(fragment3).commit();
getSupportFragmentManager().beginTransaction().add(R.id.main_fragments_holder, fragment4).commit();
bottomNavigationView = findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.bottom_nav_1: {
getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter_mild, R.anim.exit_mild).hide(fragment2).hide(fragment3).hide(fragment4).show(fragment1).commit();
break;
}
case R.id.bottom_nav_2: {
getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter_mild, R.anim.exit_mild).hide(fragment1).hide(fragment3).hide(fragment4).show(fragment2).commit();
break;
}
case R.id.bottom_nav_3: {
getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter_mild, R.anim.exit_mild).hide(fragment1).hide(fragment2).hide(fragment4).show(fragment3).commit();
break;
}
case R.id.bottom_nav_4: {
getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter_mild, R.anim.exit_mild).hide(fragment1).hide(fragment2).hide(fragment3).show(fragment4).commit();
break;
}
}
return true;
}
});
проблема состоит в том, что, поскольку эти фрагменты имеют разные высоты (в зависимости от их положения в стеке), анимация перехода между ними не одинакова. если текущий фрагмент выше, входная анимация выбранного фрагмента не видна (потому что он находится ниже текущего фрагмента). как справиться с этой ситуацией, чтобы анимации перехода были одинаковыми?
используются следующие анимации:
enter_mild. xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:fillAfter="false"
android:interpolator="@android:anim/decelerate_interpolator">
<alpha
android:fromAlpha="0"
android:toAlpha="1" />
<scale
android:fromXScale=".9"
android:fromYScale=".9"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1"
android:toYScale="1" />
</set>
exit_mild. xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:fillAfter="false"
android:interpolator="@android:anim/accelerate_interpolator">
<alpha
android:fromAlpha="1"
android:toAlpha="0" />
<scale
android:fromXScale="1"
android:fromYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale=".9"
android:toYScale=".9" />
</set>