Android - Спеціальна анімація на фрагментарній транзакції не запущена


83

Я використовую 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
Фрагменти були представлені лише до Honeycomb (API 11, Android 3.0). Це може бути проблемою, але я міг би подумати, що Eclipse скаже вам.
Стів Блеквелл

6
Ось чому я використовую пакет підтримки.
adheus

Відповіді:


256

Менеджер складав мою транзакцію до того, як я встановив анімацію, тому вона складає транзакцію без анімації (сумно, але правдиво), і це відбувається, навіть якщо я здійснюю транзакцію після 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();

тож вам доведеться розбити заяву, уникаючи трюку
самоповерненого

4
transaction.something().somethingelse().replace().commit(), багато методів android повертаються, thisщоб можна було уникнути перетипування змінної, але якось тут setCustomAnimations()виявляється побічний ефект і його слід викликати окремо
sherpya

44
Зазначимо, "трюк із самоповерненим об'єктом" називається "ланцюжок методів"
Єгор

Метод ланцюжка вищевказаного виклику безумовно працює. Просто перевірив це у своєму власному проекті.
MawrCoffeePls

Для додаткового, щоб анімувати фрагмент, коли вискакує із зворотного стека, використовуйте transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_left, R.anim.slide_out_right);замість нього.
Джастін,

23

Як було запропоновано вище, окремі твердження точно будуть працювати. Але фокус тут полягає в тому, щоб 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знайшов це корисним. На здоров’я!


1
Мене ображає те, як ти використовуєш оператор "точка" для ланцюжка методів.
Шайшав

1
Погодився @Shaishav, написав цю відповідь два роки тому, оновивши її .. Дякую!
Harisewak

7

Залишаючи це тут, як найбільш популярне питання. У мене була та ж проблема з не анімацією транзакції фрагментів. Злочинець був має атрибут android:animateLayoutChangesвстановлений в trueв містить макеті.

Сподіваюся, це допоможе комусь заощадити час на пошук рішення, оскільки це важко помітити при вкладених макетах у різні файли.


Анімація працює зараз, але нова проблема - це зміна поведінки анімації. перед тим, як він ковзає горизонтально (як очікувалося). тепер розширюється з кута
Шарад Кале

0

Іншою причиною може бути непотрібне розміщення fragmentTransaction.show()перед комітом. Це робить поп-переходи не відображаються в деяких версіях API для Android.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.