@@@@@@@@@@@@@@@@@@@@@@@@@@@
EDIT: Saya akhirnya tidak menerapkan solusi ini karena ada masalah lain yang dimilikinya. Square baru-baru ini keluar dengan 2 library yang menggantikan fragmen. Saya akan mengatakan ini sebenarnya mungkin alternatif yang lebih baik daripada mencoba meretas fragmen untuk melakukan sesuatu yang tidak diinginkan Google.
http://corner.squareup.com/2014/01/mortar-and-flow.html
@@@@@@@@@@@@@@@@@@@@@@@@@@@
Saya pikir saya akan memberikan solusi ini untuk membantu orang-orang yang memiliki masalah ini di masa depan. Jika Anda menelusuri percakapan poster asli dengan orang lain, dan melihat kode yang dia posting, Anda akan melihat poster asli akhirnya sampai pada kesimpulan menggunakan animasi tanpa operasi pada fragmen turunan sambil menganimasikan fragmen induk. Solusi ini tidak ideal karena memaksa Anda untuk melacak semua fragmen turunan, yang dapat merepotkan saat menggunakan ViewPager dengan FragmentPagerAdapter.
Karena saya menggunakan Fragmen Anak di semua tempat, saya mendapatkan solusi ini yang efisien, dan modular (sehingga dapat dengan mudah dihapus) jika mereka memperbaikinya dan animasi tanpa operasi ini tidak lagi diperlukan.
Ada banyak cara untuk menerapkan ini. Saya memilih untuk menggunakan singleton, dan saya menyebutnya ChildFragmentAnimationManager. Ini pada dasarnya akan melacak fragmen anak untuk saya berdasarkan induknya dan akan menerapkan animasi tanpa operasi ke anak-anak ketika diminta.
public class ChildFragmentAnimationManager {
private static ChildFragmentAnimationManager instance = null;
private Map<Fragment, List<Fragment>> fragmentMap;
private ChildFragmentAnimationManager() {
fragmentMap = new HashMap<Fragment, List<Fragment>>();
}
public static ChildFragmentAnimationManager instance() {
if (instance == null) {
instance = new ChildFragmentAnimationManager();
}
return instance;
}
public FragmentTransaction animate(FragmentTransaction ft, Fragment parent) {
List<Fragment> children = getChildren(parent);
ft.setCustomAnimations(R.anim.no_anim, R.anim.no_anim, R.anim.no_anim, R.anim.no_anim);
for (Fragment child : children) {
ft.remove(child);
}
return ft;
}
public void putChild(Fragment parent, Fragment child) {
List<Fragment> children = getChildren(parent);
children.add(child);
}
public void removeChild(Fragment parent, Fragment child) {
List<Fragment> children = getChildren(parent);
children.remove(child);
}
private List<Fragment> getChildren(Fragment parent) {
List<Fragment> children;
if ( fragmentMap.containsKey(parent) ) {
children = fragmentMap.get(parent);
} else {
children = new ArrayList<Fragment>(3);
fragmentMap.put(parent, children);
}
return children;
}
}
Selanjutnya Anda perlu memiliki kelas yang memperluas Fragmen yang diperluas oleh semua Fragmen Anda (setidaknya Fragmen Anak Anda). Saya sudah memiliki kelas ini, dan saya menyebutnya BaseFragment. Saat tampilan fragmen dibuat, kami menambahkannya ke ChildFragmentAnimationManager, dan menghapusnya saat dihancurkan. Anda bisa melakukan ini onAttach / Detach, atau metode lain yang cocok secara berurutan. Logika saya untuk memilih Buat / Hancurkan Tampilan adalah karena jika Fragmen tidak memiliki Tampilan, saya tidak peduli untuk menganimasinya agar terus terlihat. Pendekatan ini juga akan bekerja lebih baik dengan ViewPager yang menggunakan Fragmen karena Anda tidak akan melacak setiap Fragment yang dipegang FragmentPagerAdapter, melainkan hanya 3.
public abstract class BaseFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Fragment parent = getParentFragment();
if (parent != null) {
ChildFragmentAnimationManager.instance().putChild(parent, this);
}
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onDestroyView() {
Fragment parent = getParentFragment();
if (parent != null) {
ChildFragmentAnimationManager.instance().removeChild(parent, this);
}
super.onDestroyView();
}
}
Sekarang semua Fragmen Anda disimpan dalam memori oleh fragmen induk, Anda dapat memanggil animate-nya seperti ini, dan fragmen turunan Anda tidak akan hilang.
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ChildFragmentAnimationManager.instance().animate(ft, ReaderFragment.this)
.setCustomAnimations(R.anim.up_in, R.anim.up_out, R.anim.down_in, R.anim.down_out)
.replace(R.id.container, f)
.addToBackStack(null)
.commit();
Juga, asal Anda memilikinya, berikut adalah file no_anim.xml yang ada di folder res / anim Anda:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/linear_interpolator">
<translate android:fromXDelta="0" android:toXDelta="0"
android:duration="1000" />
</set>
Sekali lagi, menurut saya solusi ini tidak sempurna, tetapi jauh lebih baik daripada untuk setiap contoh Anda memiliki Fragmen Anak, menerapkan kode khusus di fragmen induk untuk melacak setiap anak. Saya pernah ke sana, dan itu tidak menyenangkan.
R.id.fragmentHolder
dengan A, A1, A2, dll?