Подтвердить что ты не робот

Как оживить удаление фрагментов

Я хочу анимировать удаление фрагмента.

Я пробовал:

getSupportFragmentManager().beginTransaction()
    .setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out)
    .remove(myFragment)
    .commit();

но фрагмент просто исчезает.

Я заметил, что анимация только воспроизводится с помощью "replace", поэтому я попытался заменить фрагмент на пустой фрагмент следующим образом:

getSupportFragmentManager()
    .beginTransaction()
    .setCustomAnimations(R.anim.push_down_in, R.anim.push_up_out)
    .replace(viewId, new Fragment())
.commit();

Но он все еще просто исчезает, исчезает.

Итак, как я могу анимировать удаление фрагмента?

4b9b3361

Ответ 1

Я понял это.

Выходное представление анимируется на холсте входного представления, поэтому, если нет входного холста, для анимации нет холста.

Чтобы показать анимацию, мне приходилось всегда использовать замену и использовать входящие фрагменты того же размера, что и те, которые выходят. После завершения анимации я установил, что новые фрагменты исчезли.

Ответ 2

Я видел это, когда у меня были подобные проблемы, и просто подумал, что Id опустил быструю ноту.

Вместо того, чтобы создавать фиктивный фрагмент, чтобы заменить существующий, я думаю, вы должны анимировать текущее представление фрагментов. Когда анимация заканчивается, вы можете просто удалить фрагмент.

Вот как я это сделал:

final FragmentActivity a = getSherlockActivity();

if (a != null) {
    //Your animation
    Animation animation = AnimationUtils.loadAnimation(a, R.anim.bottom_out);
    animation.setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime));

    //You can use AnimationListener, MagicAnimationListener is simply a class extending it.
    animation.setAnimationListener(new MagicAnimationListener() {
        @Override
        public void onAnimationEnd(Animation animation) {
            //This is the key, when the animation is finished, remove the fragment.
            try {
                FragmentTransaction ft = a.getSupportFragmentManager().beginTransaction();
                ft.remove(RestTimerFragment.this);
                ft.commitAllowingStateLoss();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    //Start the animation.  
    getView().startAnimation(animation);
}

Ответ 3

Вы можете анимировать удаление, установив эту пользовательскую анимацию для фрагмента транзакции.

        fragmentTransaction.setCustomAnimations(R.anim.right_in, R.anim.defff,R.anim.defff,R.anim.right_out);

Третий и четвертый параметры предназначены для удаления фрагмента.

Ответ 4

Замена пустым фрагментом перед точкой вставки следующего фрагмента, а также задержка вставки следующего фрагмента (на 200 мс), чтобы анимация выхода пустого фрагмента могла играть, решила мою проблему.

Этот код вставляет пустой фрагмент с анимацией выхода.

getSupportFragmentManager()
                        .beginTransaction()
                        .setCustomAnimations(R.anim.exit, R.anim.pop_exit)
                        .replace(R.id.fragmentLayout, new Fragment())
                        .commit();

Exit.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="-100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="200"/>

</set>

pop_exit.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="200"/>

</set>

Ответ 5

Я получил вдохновение от ответа Zoltish, это моя реализация:

1.add этот метод внутри фрагмента, он будет анимировать фрагмент из экрана влево:

public void animateOut()
{
    TranslateAnimation trans=new TranslateAnimation(0,-300*Utils.getDensity(getActivity()), 0,0);
    trans.setDuration(150);
    trans.setAnimationListener(new Animation.AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            // TODO Auto-generated method stub
            ((BetsActivty)getActivity()).removeFrontFragmentAndSetControllToBetting();
        }
    });
    getView().startAnimation(trans);
}

Метод, который внутри atAnimationEnd() удаляет фрагмент следующим образом:

getSupportFragmentManager().beginTransaction().
        remove(getSupportFragmentManager().findFragmentById(R.id.fragment_container)).commit();

2.Выполните animateOut фрагмента из onBack() активности.

Приветствия

кстати, мой getDensity():

public static int getDensity(Context context)
{
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return (int)metrics.density;
}

с этим я рассчитываю значение DP для текущего текущего устройства.

Ответ 6

поскольку @hugoc сказал

Выходное представление анимируется на холсте входного представления, поэтому, если нет входного холста, для анимации нет холста.

Чтобы показать анимацию, мне приходилось всегда использовать замену и использовать входящие фрагменты того же размера, что и те, которые выходят. После завершения анимации я установил, что новые фрагменты исчезли.

ниже - действительный код:

FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.setCustomAnimations(R.anim.slide_in_bottom, R.anim.slide_out_top);
    transaction.hide(removeFragment).add(R.id.fragment_container,addFragment).commit();
    transaction = manager.beginTransaction();
    transaction.remove(removeFragment).commit();

Ответ 7

Я согласился с hugoc и вот какой код решить его

public class MyActivity extends Activity {
    //Some thing
    public void Fragment2BackToFragment1(Fragment fragment1, Fragment fragment2) {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();
        animateExit(fragment2);
        ft.replace(R.id.main_content, fragment1, "fragment1");
        ft.commit();
    }
    private void animateExit(Fragment exitFragment) {
        if (exitFragment != null) {
            final View view = exitFragment.getView();
            if (view != null) {
                int anim = R.anim.fade_out;
                Animation animation =
                    AnimationUtils.loadAnimation(getActivity(), anim);
                animation.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {

                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {
                        view.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                view.setVisibility(View.GONE);
                            }
                        }, 300);
                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {


                    }
                });
                view.startAnimation(animation);
            }
        }
    }
}

Ответ 8

Что введите:
это новый фрагмент, который должен быть показан

Какой выход:
это текущий фрагмент, который должен быть скрыт

Что такое popEnter:
это предыдущий фрагмент, который должен быть показан

Какой popExit:
это текущий фрагмент, который должен быть скрыт

Для использования этих анимаций вам следует настроить таргетинг на команды show или hide transaction. Выйти из анимации не работает с процедурами удаления/замены.

Ответ 9

Легкое исправление ниже:

1-Вызов анимировать для фрагмента. GetView().

2-Удалить фрагмент внутри onAnimationEnd().

final Fragment frag= getSupportFragmentManager().findFragmentById(R.id.fragmentContainer);
        frag.getView().animate().alpha(0f).scaleX(0f).scaleY(0f)

                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        super.onAnimationEnd(animation);
                        getSupportFragmentManager()
                                .beginTransaction()
                                .remove(frag)
                                .commit();
                    }
                }).start();

Ответ 10

setCustomAnimations (enter, exit, popEnter, popExit) поддерживают анимацию входа и выхода, поэтому задайте четыре анимации и сохраните их до транзакции.replace()

Котлин:

    val manager = supportFragmentManager
    val transaction = manager.beginTransaction()
    transaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right ,
            android.R.anim.slide_in_left, android.R.anim.slide_out_right)
    transaction.commit()

Ответ 11

Итак, простой способ:

Когда вы открываете фрагмент (вызывается из родительского Activity):

    FragmentA fragment = new FragmentA();
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setCustomAnimations(R.anim.slide_up, R.anim.slide_down);
    transaction.add(android.R.id.content, fragment);
    transaction.addToBackStack(null);
    transaction.commit();

Укажите транзакции входа и выхода

transaction.setCustomAnimations(R.anim.slide_up, R.anim.slide_down);

При закрытии фрагмента (вызывается изнутри фрагмента)

getActivity().getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_up, R.anim.slide_down).remove(this).commit();

Укажите транзакции входа и выхода

setCustomAnimations (R.anim.slide_up, R.anim.slide_down)