BackStack'te Fragman Animasyonları Nasıl Tersine Çevirilir?


114

Aşağıdaki kodu kullanarak parçaları kullanırken geri düğmesine basıldığında sistemin arka istifteki animasyonları tersine çevireceğini düşündüm:

FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out);
ft.replace(R.id.viewContainer, new class(), "layout").addToBackStack(null).commit();

Yanıtlar:


266

Özel animasyon için android belgelerine göre :

Değişiklik:

ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out);

Kime:

ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out, R.anim.hyperspace_in, R.anim.slide_out );

ve şimdi arka istif canlanıyor - Tersine !!


2
btw, bunun sorunuz ve cevabınızla bağlantılı olmadığını biliyorum, ancak beni customAnimations'ı biraz açıklayan bir şeye bağlayabilir misiniz? : P
AreusAstarte

2
AreusAstarte: developer.android.com/reference/android/app/… , int, int, int'e bakın
mDroidd

Merhaba im aslında İçerik geçişini kullanıyor, iyi çalışıyor, ancak geri basıp önceki bölüme gittiğimde, arka plan görünümleri canlandırırken kayboluyor, aynı zamanda daha önce gelenlerle örtüşüyor, bundan kaçınmanın herhangi bir yolu var mı?
user3497504

23

Doğru animasyonu kullanın Aşağıdakileri kullandım ve bir tılsım gibi çalışıyor

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_mediumAnimTime" >
    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:propertyName="x"
        android:valueFrom="1000"
        android:valueTo="0"
        android:valueType="floatType" />
</set>

slide_in_right.xml

 <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_mediumAnimTime" >

    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:propertyName="x"
        android:valueFrom="0"
        android:valueTo="1000"
        android:valueType="floatType" />

</set>

slide_out_left.xml

   <set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_mediumAnimTime" >

    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:propertyName="x"
        android:valueFrom="0"
        android:valueTo="-1000"
        android:valueType="floatType" />

</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_mediumAnimTime" >

    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:propertyName="x"
        android:valueFrom="-1000"
        android:valueTo="0"
        android:valueType="floatType" />

</set>

Ardından parça eklerken aşağıdakileri kullanın

setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left,
                                R.anim.slide_out_right, R.anim.slide_in_right)

ve% 100 işe yarayacak


2
Destek parçası yöneticisini kullanıyorsanız veya
parçanız

@ w3bshark Bu tür animasyonları destek kitaplığından FragmentManagerve Fragmentdestek kitaplığından nasıl çalıştırabilirim?
Daniel Shatz

2
@DanielShatz objectAnimators yerine çevirileri kullanmalısınız. Örneğin, slide_in_left.xml şu şekilde olacaktır: <translate android:fromXDelta="100%" android:startOffset="25" android:toXDelta="0" />Bu yanıta bakın: stackoverflow.com/a/5151774/1738090
w3bshark

1
Bunu deniyorum (Marshmallow cihazında - diğer sürümleri denemedim). Çalışmıyor. final FragmentTransaction fragmentTransaction = getFragmentManager (). beginTransaction (); fragmentTransaction.setCustomAnimations (R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right); fragmentTransaction.replace (R.id.fl_right_container, detailFragment); fragmentTransaction.replace (R.id.fl_left_container, subcategoriesFragment, TestActivity.TAG_SUBCATEGORIES_FRAGMENT); fragmentTransaction.commit ();
techtinkerer

13

benim durumumda

fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right, 
                       R.anim.slide_in_right, R.anim.slide_out_left);

mükemmel bir animasyon yaratırdı.

slide_in_right

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="50%p" android:toXDelta="0"
               android:duration="@android:integer/config_mediumAnimTime"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
           android:duration="@android:integer/config_mediumAnimTime" />
</set>

slide_out_left

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-50%p"
               android:duration="@android:integer/config_mediumAnimTime"/>
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
           android:duration="@android:integer/config_mediumAnimTime" />
</set>

1
Kendi kendime yapmayı düşündüm ama çok tembelim. Ve birinin bunu StackOverflow'da yayınlaması gerektiğini söyledim ve işte burada! haha
F.Mysir

1
Bunu daha önce kimse göndermemişti ve ben de bu cevabı gönderme sırasının bende olduğuna inandım, benimle aynı ayakkabıda kim olabilir ki ... lol @ F.Mysir
Hoang Nguyen Huu

3
.setCustomAnimations(R.animator.fragment_fade_in,
        R.animator.fragment_fade_out,
        R.animator.fragment_fade_p_in,
        R.animator.fragment_fade_p_out)

Yukarıdakileri şununla değiştirin:

mFragmentManager.beginTransaction()
    .setCustomAnimations(R.animator.fragment_fade_in,
            R.animator.fragment_fade_out,
            R.animator.fragment_fade_p_in,
            R.animator.fragment_fade_p_out)
    .replace(R.id.main_container, FragmentPlayerInfo.getInstance(data))
    .addToBackStack(FragmentPlayerInfo.TAG)
    .commit();

1
Önerinizin nasıl yardımcı olduğuna dair bir açıklama eklemenizi tavsiye ederim.
Wtower

2
Neden çalıştığını bilmiyorum (: ama sonra animasyon eklendiğinde replaceve addToBackstackçalışmıyor
TarikW

2
@TarikW biraz geciktim, ancak bu konuda sipariş önemlidir, değiştirmeden önce setCostomAnimations'ı çağırmanız gerekir, addToBackStack yöntemleri
MD Husnain Tahir

1

Bu, Fragment Transaction sınıfında belirtildiği gibidir.

/**
     * Set specific animation resources to run for the fragments that are
     * entering and exiting in this transaction. The <code>popEnter</code>
     * and <code>popExit</code> animations will be played for enter/exit
     * operations specifically when popping the back stack.
     *
     * @param enter An animation or animator resource ID used for the enter animation on the
     *              view of the fragment being added or attached.
     * @param exit An animation or animator resource ID used for the exit animation on the
     *             view of the fragment being removed or detached.
     * @param popEnter An animation or animator resource ID used for the enter animation on the
     *                 view of the fragment being readded or reattached caused by
     *                 {@link FragmentManager#popBackStack()} or similar methods.
     * @param popExit An animation or animator resource ID used for the enter animation on the
     *                view of the fragment being removed or detached caused by
     *                {@link FragmentManager#popBackStack()} or similar methods.
     */
    @NonNull
    public abstract FragmentTransaction setCustomAnimations(@AnimatorRes @AnimRes int enter,
            @AnimatorRes @AnimRes int exit, @AnimatorRes @AnimRes int popEnter,
            @AnimatorRes @AnimRes int popExit);

Sonunda böyle bir yöntem kullanabilirsin

 mFragmentManager.beginTransaction()
                        .replace(R.id.container, fragment)
                        .setCustomAnimations(R.anim.slide_left,//enter
                                             R.anim.slide_out_left,//exit
                                             R.anim.slide_right,//popEnter
                                             R.anim.slide_out_right)//popExit
                        .addToBackStack(fragment.toString())
                        .commit();

0

bu benim için çalışıyor !! parça için bu kod! Bu kodu aktivitede kullanmak istiyorsanız, baştan silin getActivity()!!

getActivity().getSupportFragmentManager()
        .beginTransaction()
        .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.fade_out,android.R.anim.slide_in_left, android.R.anim.fade_out)
        .replace(R.id.fragment_container, new YourFragment)
        .addToBackStack(null)
        .commit();

Sana iyi şanslar!!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.