Saya mengonversi aplikasi untuk menggunakan fragmen menggunakan perpustakaan kompatibilitas. Sekarang saat ini saya memiliki sejumlah kegiatan (ABCD) yang berantai satu sama lain, D memiliki tombol 'OK' yang ketika panggilan selesai ditekan yang kemudian muncul onActivityResult()
untuk menghancurkan C dan B.
Untuk versi fragmen Honycomb pra saya, setiap kegiatan secara efektif merupakan pembungkus pada fragmen Af Bf Cf Df. Semua aktivitas diluncurkan melalui startActivityForResult()
dan onActivityResult()
dalam setiap fragmen yang dapat dengan senang hati dipanggilgetActivity().finish()
Masalah yang saya alami adalah dalam versi Honeycomb saya, saya hanya memiliki satu aktivitas, A, dan fragmen Bf, Cf, Df yang dimuat menggunakan FragmentManager
.
Apa yang saya tidak mengerti adalah apa yang harus dilakukan dalam Df ketika 'OK' ditekan untuk menghapus fragmen Df, Cf, dan Bf?
Saya mencoba memiliki fragmen muncul dari tumpukan tetapi ini menghasilkan pengecualian. onActivityResult()
tidak berguna karena saya belum memuat fragmen menggunakan startActivityForResult()
.
Apakah saya memikirkan hal ini sepenuhnya salah? Haruskah saya menerapkan semacam pendengar yang berkomunikasi dengan fragmen induk atau aktivitas untuk melakukan pop menggunakan manajer transaksi?
Jawaban:
Langkah # 1: Minta beri tahu D "yo! Kami mendapat klik OK!" melalui memanggil suatu metode, baik pada aktivitas itu sendiri, atau pada instance antarmuka yang disediakan oleh aktivitas.
Langkah # 2: Minta D menghapus fragmen melalui
FragmentManager
.Aktivitas hosting (D) adalah yang tahu apa fragmen lain dalam aktivitas tersebut (vs. berada di aktivitas lain). Oleh karena itu, peristiwa dalam fragmen yang mungkin mempengaruhi campuran fragmen harus disebarkan ke aktivitas, yang akan membuat orkestrasi bergerak sesuai.
sumber
finish()
sudah cukup.onDestroy()
metode ke fragmen Anda dan lihat apakah itu dipanggil.Meskipun mungkin bukan pendekatan terbaik yang setara terdekat saya bisa memikirkan yang berfungsi adalah ini dengan perpustakaan dukungan / kompatibilitas
atau
jika tidak.
Selain itu, Anda dapat menggunakan backstack dan pop itu. Namun perlu diingat bahwa fragmen mungkin tidak ada di backstack (tergantung pada fragmen transaksi yang sampai di sana ..) atau mungkin bukan yang terakhir yang masuk ke tumpukan sehingga memunculkan tumpukan bisa menghilangkan yang salah ...
sumber
Anda dapat menggunakan pendekatan di bawah ini, itu berfungsi dengan baik:
sumber
popBackStack()
adalah satu-satunya solusi yang berfungsi ketika Anda ingin mengatur judul bilah tindakan kembali ke keadaan sebelumnya setelah Anda menghapus fragmen. Kalau tidak, saya tidak perlu menggabungkan kedua solusi berperingkat tinggi dari stackoverflow.com/questions/13472258/… dan solusi ini di sini untuk selalu menetapkan judul bar tindakan yang tepat setelah berbagai kasus penggunaan. seperti menekan kembali, menghapus, menambahkan penggantian, dan sebagainya.Anda harus membiarkan Kegiatan berurusan dengan menambah dan menghapus Fragmen, seperti kata CommonsWare, menggunakan pendengar. Berikut ini sebuah contoh:
sumber
Dalam Activity / AppCompatActivity:
lalu panggil fragmen:
atau seperti yang dinyatakan dalam jawaban lain, sebut ini di fragmen:
sumber
Jika Anda menggunakan Komponen Navigasi baru, sesederhana itu
Ini akan melakukan semua Transaksi Fragment di belakang untuk Anda.
sumber
Lihat apakah kebutuhan Anda dipenuhi oleh DialogFragment. DialogFragment memiliki metode dismiss (). Jauh lebih bersih menurut saya.
sumber
Saya membuat metode sederhana untuk itu
Daripada menempatkannya di kelas ActivityUtils saya
Ini bekerja dengan baik, bersenang-senanglah!
sumber
OnCreate:
Ini adalah bagaimana saya menyembunyikan fragmen di event klik 1
Kemudian Perlihatkan kembali ke acara 2
sumber
Jika Anda perlu mem-popback dari fragmen keempat dalam sejarah backstack ke yang pertama, gunakan tag !!!
Saat Anda menambahkan fragmen pertama Anda harus menggunakan sesuatu seperti ini:
atau
Dan ketika Anda ingin menunjukkan Fragmen B, C dan D Anda menggunakan ini:
dan surat-surat lainnya ....
Untuk kembali ke
Fragment
A, panggil sajapopBackStack(0, "A")
, ya, gunakan bendera yang Anda tentukan saat Anda menambahkannya, dan perhatikan bahwa itu haruslah bendera yang sama dalam perintahaddToBackStack()
, bukan yang digunakan dalam perintah, ganti atau tambahkan.Sama-sama ;)
sumber
Untuk Menutup fragmen sementara di dalam fragmen yang sama
sumber
Kenapa tidak adil:
getActivity (). finish ();
sumber