Używam Google API 8 (Android 2.2) z pakietem pomocy v4.
Nie daje żadnego błędu ani animacji.
Transakcja:
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.content, myFragment);
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
transaction.commit();
Animacje:
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>
Czy ktoś wie, co się tutaj dzieje?
Odpowiedzi:
Menedżer układał moją transakcję przed ustawieniem animacji, więc układa transakcję bez animacji (smutne, ale prawdziwe), a dzieje się tak nawet, jeśli zatwierdzę transakcję po
setCustomAnimations()
.Rozwiązaniem jest ustawienie najpierw animacji:
FragmentTransaction transaction = manager.beginTransaction(); transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); transaction.replace(R.id.content, myFragment); transaction.commit();
źródło
transaction.something().somethingelse().replace().commit()
, wiele metod Androida powraca,this
więc można uniknąć ponownego wpisywania zmiennej, ale w jakiś sposób tutaj ujawnia efekt uboczny isetCustomAnimations()
należy je wywołać osobnotransaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_left, R.anim.slide_out_right);
zamiast tego.Jak zasugerowano powyżej, oddzielne stwierdzenia na pewno się sprawdzą. Ale sztuczka polega na tym, aby
setCustomAnimation
przed ustawieniem typu transakcji, a mianowicie.add
,replace
Itp indziej nie. Tak więc zastosowanie tej samej logikimethod chaining
również działa. na przykład.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();
Umieszczenie go tutaj, aby ktoś, kto woli,
method chaining
uznał to za pomocne. Twoje zdrowie!źródło
Zostawiając to tutaj, ponieważ jest to najpopularniejsze pytanie. Miałem ten sam problem z brakiem animacji transakcji fragmentów. Sprawca miał
android:animateLayoutChanges
ustawiony atrybuttrue
w układzie zawierającym.Mam nadzieję, że pomoże to komuś zaoszczędzić trochę czasu na szukaniu rozwiązania, ponieważ może to być trudne do zauważenia w przypadku zagnieżdżonych układów w różnych plikach.
źródło
Innym powodem może być niepotrzebne umieszczanie
fragmentTransaction.show()
przed zatwierdzeniem. To sprawia, że przejścia pop nie są wyświetlane w niektórych wersjach Androida API.źródło