menukar fragmen dalam suatu aktivitas melalui animasi

94

Saya ingin menukar dua fragmen dalam suatu aktivitas melalui animasi. Misalkan PageA adalah untuk fragement A dan sisi kiri pada layar dan PageB adalah untuk fragmen B yaitu di sisi kanan layar. Sekarang saya ingin ketika saya mengklik tombol di halamanA maka PageA akan pindah ke sisi kanan layar dengan beberapa animasi transisi.

Saya mencoba kode di bawah ini untuk mengganti posisi

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();

Mencari petunjuk.

Terima kasih sebelumnya.

Deepak Goel
sumber
1
kemungkinan duplikat dari Animate transisi antar fragmen
TalkLittle

Jawaban:

285

Pencarian lama dan Anda mungkin sudah menemukannya, tetapi untuk referensi di masa mendatang:

inilah yang Anda gunakan untuk menyetel animasi khusus saat Anda mengganti fragmen melalui kode:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, "fragment");
// Start the animated transition.
ft.commit();

Berikut adalah contoh animasi slide_in_left:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <translate xmlns:android="http://schemas.android.com/apk/res/android"
   android:fromXDelta="-100%"
   android:toXDelta="0"
   android:interpolator="@android:anim/decelerate_interpolator"
   android:duration="500"/>
</set>

Perhatikan bahwa ini adalah animasi jika Anda menggunakan pustaka kompatibilitas. Sebaliknya, jika Anda menggunakan dan SDK dengan dukungan asli untuk FragmentManager, animasi Anda akan terlihat seperti ini:

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

Ini karena pustaka kompatibilitas tidak mendukung tipe objectAnimator baru dan sebagai gantinya hanya mengimplementasikan kerangka animasi lama.

sciutand
sumber
92
Ini pasti jawaban yang benar. Perhatikan bahwa urutan itu penting! Anda harus memiliki panggilan setCustomAnimations () sebelum panggilan tambah / ganti!
theelfismike
2
Jadi pendekatan mana yang harus Anda gunakan jika Anda ingin comp terbaik?
basickarl
17
Animasi yang berbeda ini tidak sama persis. Anda mengasumsikan lebar fragmen Anda sama dengan 1280 dengan menggunakan valueFrom dari -1280. Jika lebarnya lebih besar, itu tidak akan mulai sepenuhnya dari layar.
egfconnor
53
Sebagai gantinya, Anda bisa menggunakan animasi yang telah ditentukan dari namespace android: transaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);
Jordy
2
Animasi yang ditentukan sebelumnya memicu runtimeexception, FWIW, karena mereka bergantung pada tag "terjemahkan".