Анимация перехода между фрагментами зависит от положения в стеке - PullRequest
0 голосов
/ 21 февраля 2020

Я использую 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>
...