Android - Пользовательская анимация на транзакции фрагмента не запущена

Я использую Google API 8 (Android 2.2) с пакетом поддержки v4.

Он не дает никакой ошибки или анимации.

Сделка:

FragmentTransaction transaction = manager.beginTransaction();       
transaction.replace(R.id.content, myFragment);
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
transaction.commit();

анимаций:

slide_in_left.xml

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

slide_out_right.xml

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

Кто-нибудь знает, что здесь происходит?

Ответ 1

Менеджер уложил мою транзакцию до того, как я установил анимацию, поэтому она стекирует транзакцию без анимаций (грустная, но истинная), и это происходит, даже если я совершу транзакцию после setCustomAnimations().

Решение состоит в том, чтобы сначала установить анимацию:

FragmentTransaction transaction = manager.beginTransaction();       
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
transaction.replace(R.id.content, myFragment);
transaction.commit();

Ответ 2

Как было сказано выше, отдельные заявления, безусловно, будут работать. Но трюк здесь равен setCustomAnimation, прежде чем устанавливать тип транзакции: add, replace и т.д., Иначе это не так. Итак, применяя ту же логику, method chaining также работает. например.

getSupportFragmentManager().beginTransaction().
                setCustomAnimations(R.anim.a_slide_up, R.anim.a_slide_down, R.anim.a_slide_up, R.anim.a_slide_down).
                add(R.id.root_layout, MyFrag.newInstance().
                addToBackStack("MyFrag").
                commit();

Поместите его сюда, чтобы кто-то, предпочитающий method chaining, нашел его полезным. Ура!

Ответ 3

Оставив это здесь как самый популярный вопрос. У меня была та же проблема, что и транзакция фрагмента, не анимация. У виновника был атрибут android:animateLayoutChanges установлен на true в содержащем макете.

Я надеюсь, что это поможет кому-то сэкономить время на поиск решения, поскольку его трудно заметить при наличии вложенных макетов в разных файлах.