Bagaimana Cara Membalik Animasi Fragmen di BackStack?


114

Saya pikir sistem akan membalikkan animasi di backstack ketika tombol kembali ditekan saat menggunakan fragmen menggunakan kode berikut:

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();

Jawaban:


266

Menurut dokumentasi android untuk animasi kustom :

Perubahan:

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

Untuk:

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

dan sekarang backstack bergerak - Terbalik !!


2
btw, saya tahu ini tidak terkait dengan pertanyaan dan jawaban Anda, tetapi bisakah Anda menautkan saya ke sesuatu yang menjelaskan sedikit tentang customAnimations? : P
AreusAstarte

2
AreusAstarte: lihat developer.android.com/reference/android/app/… , int, int, int)
mDroidd

Hai saya sebenarnya menggunakan Transisi konten, berfungsi dengan baik, tetapi ketika saya menekan kembali dan pergi ke fragmen sebelumnya, latar belakang hanya menghilang dengan menghidupkan tampilan tetapi juga menutupi dengan yang sebelumnya, ada cara untuk menghindari ini?
pengguna3497504

23

Gunakan animasi yang benar Saya telah menggunakan yang berikut ini dan bekerja seperti pesona

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>

Kemudian Gunakan mengikuti sambil menambahkan fragmen

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

dan itu akan berhasil 100%


2
Perhatikan bahwa ini tidak akan berfungsi jika Anda menggunakan manajer fragmen dukungan atau jika fragmen Anda memperluas versi dukungan Fragmen
w3bshark

@ w3bshark Bagaimana cara menjalankan animasi seperti itu menggunakan FragmentManagerdan Fragmentdari pustaka dukungan?
Daniel Shatz

2
@DanielShatz Anda harus menggunakan terjemahan daripada objectAnimators. Misalnya, slide_in_left.xml akan menjadi: <translate android:fromXDelta="100%" android:startOffset="25" android:toXDelta="0" />Lihat jawaban ini: stackoverflow.com/a/5151774/1738090
w3bshark

1
Saya mencoba ini (pada perangkat Marshmallow - tidak mencoba versi lain). Itu tidak berhasil. 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

dalam kasus saya

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

akan membuat animasi yang sempurna.

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
Saya berpikir untuk melakukannya sendiri, tetapi saya terlalu malas. Dan saya berkata seseorang harus memposting ini di StackOverflow dan ini dia! haha
F. Myir

1
Belum ada yang memposting ini sebelumnya dan saya cukup percaya bahwa saatnya adalah giliran saya untuk memposting jawaban ini, untuk membantu sehingga siapa yang mungkin memiliki posisi yang sama dengan saya ... lol @ F. Myir
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)

Ganti yang di atas dengan:

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
Saya akan merekomendasikan Anda untuk menambahkan penjelasan tentang bagaimana rekomendasi Anda membantu.
Wtower

2
Saya tidak tahu mengapa itu berhasil (:, tetapi ketika ditambahkan animasi setelah replacedan addToBackstack, tidak berhasil
TarikW

2
@TarikW Saya agak terlambat, tetapi urutan penting dalam hal ini, Anda perlu memanggil setCostomAnimations sebelum mengganti, metode addToBackStack
MD Husnain Tahir

1

Ini seperti yang disebutkan di kelas Transaksi Fragmen.

/**
     * 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);

jadi akhirnya Anda bisa menggunakan metode seperti ini

 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

ini bekerja untuk saya !! kode ini untuk fragmen! jika Anda ingin menggunakan kode ini dalam aktivitas, hapus di awal 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();

Semoga beruntung untuk Anda !!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.