Saya menggunakan pustaka Kompatibilitas Android untuk mengimplementasikan fragmen dan telah memperluas sampel tata letak sehingga fragmen berisi tombol yang melepaskan fragmen lain.
Di panel pilihan di sebelah kiri saya memiliki 5 item yang dipilih - A B C D E
.
Setiap memuat fragmen (melalui FragmentTransaction:replace
) di panel detail -a b c d e
Sekarang saya telah memperluas fragmen e
berisi tombol yang memuat fragmen lain e1
juga di panel rincian. Saya telah melakukan ini pada e
metode onClick fragmen sebagai berikut:
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details_frag, newFrag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
Jika saya membuat pilihan berikut:
E - e - e1 - D - E
Kemudian fragmen e
ada di panel detail. Ini baik dan apa yang saya inginkan. Namun, jika saya menekan back
tombol pada saat ini tidak ada artinya. Saya harus mengklik dua kali karena e1
masih di tumpukan. Selanjutnya setelah mengklik sekitar saya mendapat pengecualian pointer nol di onCreateView:
Untuk 'memecahkan' masalah ini saya menambahkan yang berikut setiap kali A B C D E
dipilih:
FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
fm.popBackStack();
}
Hanya ingin tahu apakah ini solusi yang tepat atau apakah saya harus melakukan sesuatu yang berbeda?
Solusi bersih lainnya jika Anda tidak ingin mem-pop semua entri stack ...
Ini akan membersihkan tumpukan lebih dulu dan kemudian memuat fragmen baru, jadi pada titik tertentu Anda hanya akan memiliki satu fragmen di tumpukan
sumber
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
sebelum ganti () karena memuat panggilan FragmentonCreateView()
,onActivityCreated()
, dll Memulihkan dan Destroing sebuah Fragmen langsung buruk. Fragmen dapat mendaftarkan penerima misalnya. Ini memengaruhi kinerja.FragmentTransaction
? Apakah hanya ada kinerja buruk tumpukan fragmen yang salah?Berkat jawaban Joachim , saya menggunakan kode untuk menghapus semua entri tumpukan kembali akhirnya.
sumber
popBackStack(backStackId, INCLUSIVE)
akan memunculkan semua fragmen (status) kembali ke backStackId, jadi setelah Anda mem-pop up terendahi
yang akan Anda pop, semua yang lebih tinggi akan muncul pada waktu yang sama. Jadi apa gunanya loop?Saya telah banyak meneliti untuk membersihkan Backstack, dan akhirnya melihat Transaction BackStack dan manajemennya . Inilah solusi yang paling cocok untuk saya.
Metode di atas loop semua transaksi di backstack dan menghapusnya segera satu per satu.
Catatan: kode di atas kadang tidak berfungsi dan saya menghadapi ANR karena kode ini, jadi tolong jangan coba ini.
Perbarui metode di bawah ini menghapus semua fregment dari "nama" itu dari backstack.
sumber
Saya menggunakan kode yang sama dengan yang menggunakan loop sementara tapi saya menyebut jumlah entri di setiap loop ... jadi saya kira itu agak lambat
sumber
Seperti yang ditulis dalam Bagaimana cara mem-fragmen backstack dan oleh LarsH di sini, kita dapat mem -pop beberapa fragmen dari atas ke bawah ke tag khusus ( bersama dengan fragmen yang ditandai ) menggunakan metode ini:
Ganti "frag" dengan tag fragmen Anda. Ingat bahwa pertama-tama kita harus menambahkan fragmen ke backstack dengan:
Jika kami menambahkan fragmen
addToBackStack(null)
, kami tidak akan memecah fragmen dengan cara itu.sumber
sumber