Я использую 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>
Кто-нибудь знает, что здесь происходит?
Ответы:
Менеджер складывал мою транзакцию до того, как я установил анимацию, поэтому он складывает транзакцию без анимации (грустно, но это правда), и это происходит, даже если я фиксирую транзакцию после
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();
источник
transaction.something().somethingelse().replace().commit()
, многие методы Android возвращаются,this
поэтому вы можете избежать повторного ввода переменной, но каким-то образом здесь проявляется побочный эффект, и егоsetCustomAnimations()
следует вызывать отдельноtransaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_left, R.anim.slide_out_right);
вместо этого.Как было предложено выше, отдельные утверждения определенно будут работать. Но уловка здесь в том, чтобы
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
нашел его полезным. Ура!источник
Оставить это здесь, поскольку это самый популярный вопрос. У меня была такая же проблема с транзакцией фрагмента, которая не анимируется. Причина заключалась в том, что атрибут был
android:animateLayoutChanges
установленtrue
в содержащем макете.Я надеюсь, что это поможет кому-то сэкономить время на поиске решения, так как это может быть трудно заметить при наличии вложенных макетов в разных файлах.
источник
Другой причиной может быть ненужное размещение
fragmentTransaction.show()
перед фиксацией. Из-за этого всплывающие переходы не отображаются в некоторых версиях API Android.источник