Saya porting aplikasi Android saya ke honeycomb dan saya melakukan refactor besar untuk menggunakan fragmen. Dalam versi saya sebelumnya, ketika saya menekan tombol Home saya biasa melakukan ACTIVITY_CLEAR_TOP
untuk mengatur ulang tumpukan kembali.
Sekarang aplikasi saya hanya satu Kegiatan dengan beberapa fragmen, jadi ketika saya menekan tombol Beranda saya hanya mengganti salah satu fragmen di dalamnya. Bagaimana saya bisa membersihkan saya tumpukan kembali tanpa harus menggunakan startActivity
dengan ACTIVITY_CLEAR_TOP
bendera?
android
android-fragments
biquillo
sumber
sumber
Jawaban:
Saya memposting sesuatu yang serupa di sini
Dari jawaban Joachim, dari Dianne Hackborn:
http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42
Saya akhirnya hanya menggunakan:
Tetapi bisa sama-sama menggunakan sesuatu seperti:
Yang akan muncul semua negara hingga yang disebutkan. Anda kemudian dapat mengganti fragmen dengan apa yang Anda inginkan
sumber
Untuk membuat jawaban untuk komentar @ Warpzit dan membuatnya lebih mudah bagi orang lain untuk menemukannya.
Menggunakan:
sumber
Dengan segala hormat kepada semua pihak yang terlibat; Saya sangat terkejut melihat berapa banyak dari Anda yang bisa membersihkan seluruh tumpukan back fragmen dengan sederhana
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Menurut dokumentasi Android (mengenai
name
argumen - "null" dalam proposal kerja yang diklaim).Sekarang, saya menyadari bahwa saya kurang pengetahuan tentang implementasi khusus Anda (seperti berapa banyak entri yang Anda miliki di tumpukan belakang pada titik waktu tertentu), tetapi saya berani bertaruh semua uang saya pada jawaban yang diterima ketika mengharapkan yang terdefinisi dengan baik perilaku pada berbagai perangkat dan vendor:
(untuk referensi, sesuatu bersama dengan ini)
sumber
Bekerja untuk saya dan cara mudah tanpa menggunakan loop:
sumber
Jawaban yang diterima tidak cukup bagi saya. Saya harus menggunakan:
sumber
popBackStackImmediate()
melakukan transaksi secara serempak, yang, secara umum, keliru.Bersihkan backstack tanpa loop
Di mana nama adalah parameter addToBackStack ()
sumber
Saya hanya ingin menambahkan: -
Muncul keluar dari backstack menggunakan yang berikut
hanya tentang menghilangkan fragmen dari transaksi, tidak ada cara untuk menghapus fragmen dari layar. Jadi idealnya, itu mungkin tidak terlihat oleh Anda tetapi mungkin ada dua atau tiga fragmen ditumpuk satu sama lain, dan pada tombol kembali tekan UI mungkin terlihat berantakan, ditumpuk.
Hanya mengambil contoh sederhana: -
Misalkan Anda memiliki fragmentA yang memuat Fragmnet B menggunakan fragmentmanager.replace () dan kemudian kami menambahkanToBackStack, untuk menyimpan transaksi ini. Jadi arusnya adalah: -
LANGKAH 1 -> FragmentA-> FragmentB (kami pindah ke FragmentB, tetapi Fragment A ada di latar belakang, tidak terlihat).
Sekarang Anda melakukan beberapa pekerjaan di fragmentB dan tekan tombol Simpan - yang setelah menyimpan harus kembali ke fragmentA.
LANGKAH 2 -> Saat menyimpan FragmentB, kita kembali ke FragmentA.
LANGKAH 3 -> Jadi kesalahan umum adalah ... dalam Fragmen B, kami akan melakukan fragmen Manager.replace () fragmentB dengan fragmentA.
Tetapi apa yang sebenarnya terjadi, kami memuat Fragment A lagi, menggantikan FragmentB. Jadi sekarang ada dua FragmentA (satu dari LANGKAH-1, dan satu dari LANGKAH-3 ini).
Dua contoh FragmentsA ditumpuk satu sama lain, yang mungkin tidak terlihat, tetapi ada di sana.
Jadi, bahkan jika kita menghapus backstack dengan metode di atas, transaksi itu dihapus tetapi bukan fragmen yang sebenarnya. Jadi idealnya dalam kasus tertentu, dengan menekan tombol simpan Anda hanya perlu kembali ke fragmentA dengan hanya melakukan fm.popBackStack () atau fm.popBackImmediate () .
Jadi perbaiki Step3-> fm.popBackStack () kembali ke fragmentA, yang sudah ada dalam memori.
sumber
Membaca dokumentasi dan mempelajari apa id fragmen itu, tampaknya hanya menjadi indeks tumpukan, jadi ini berfungsi:
Nol (
0
) adalah bagian bawah tumpukan, jadi muncul hingga itu termasuk membersihkan tumpukan.CAVEAT: Meskipun cara di atas berfungsi dalam program saya, saya sedikit ragu karena dokumentasi FragmentManager tidak pernah benar-benar menyatakan bahwa id adalah indeks tumpukan. Masuk akal bahwa itu akan terjadi, dan semua log debug saya menyatakan hal itu, tetapi mungkin dalam beberapa keadaan khusus tidak? Adakah yang bisa mengkonfirmasi ini dengan satu atau lain cara? Jika ya, maka solusi di atas adalah yang terbaik. Jika tidak, ini adalah alternatifnya:
sumber
fragmentManager..getBackStackEntryAt(0).getId()
bukannya 0? Ini harus bekerja bahkan jika id entri backstack pada titik tertentu berbeda dari indeks tumpukan.Pemakaian
sumber
Hai ~ Saya menemukan solusi yang jauh lebih baik, dari: https://gist.github.com/ikew0ng/8297033
sumber
Saya dapat ini dengan cara ini:
sumber
Ini bekerja untuk saya, coba yang ini:
sumber
Panggilan ke metode ini akan sangat rapi.
sumber
sumber