Android - niestandardowa animacja przy transakcji fragmentu nie działa

83

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?

adheus
źródło
1
Fragmenty zostały wprowadzone dopiero w Honeycomb (API 11, Android 3.0). To może być problem, ale myślałem, że Eclipse ci powie.
Steve Blackwell
6
Dlatego korzystam z pakietu wsparcia.
adheus

Odpowiedzi:

257

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();
adheus
źródło
więc musisz podzielić instrukcję, unikając sztuczki z własnym zwracanym obiektem
sherpya Kwietnia
5
transaction.something().somethingelse().replace().commit(), wiele metod Androida powraca, thiswięc można uniknąć ponownego wpisywania zmiennej, ale w jakiś sposób tutaj ujawnia efekt uboczny i setCustomAnimations()należy je wywołać osobno
sherpya
46
Warto zauważyć, że „sztuczka z własnym zwróconym obiektem” nazywa się „łączeniem metod”
Egor,
Metoda łańcuchowa powyższego wywołania zdecydowanie działa. Właśnie przetestowałem to w moim własnym projekcie.
MawrCoffeePls
Aby dodatkowo animować fragment podczas wyskakiwania z tylnego stosu, użyj transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_left, R.anim.slide_out_right);zamiast tego.
Justin
24

Jak zasugerowano powyżej, oddzielne stwierdzenia na pewno się sprawdzą. Ale sztuczka polega na tym, aby setCustomAnimationprzed ustawieniem typu transakcji, a mianowicie. add, replaceItp indziej nie. Tak więc zastosowanie tej samej logiki method chainingró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 chaininguznał to za pomocne. Twoje zdrowie!

Harisewak
źródło
1
Lekko obraża mnie sposób, w jaki używasz operatora „kropki” do łączenia metod.
Shaishav
1
Zgoda @Shaishav, napisałem tę odpowiedź dwa lata temu, aktualizując ją .. Dzięki!
Harisewak
7

Zostawiając to tutaj, ponieważ jest to najpopularniejsze pytanie. Miałem ten sam problem z brakiem animacji transakcji fragmentów. Sprawca miał android:animateLayoutChangesustawiony atrybut truew 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.

Màrius Mora Bosch
źródło
Animacja teraz działa, ale nowy problem - jest to zmienione zachowanie animacji. zanim przesunie się w poziomie (zgodnie z oczekiwaniami). teraz rozwija się z rogu
Sharad Kale
0

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.

Carson Holzheimer
źródło