Bagaimana saya bisa mendapatkan instance fragmen terbaru yang ditambahkan di backstack (jika saya tidak tahu tag & id fragmen)?
FragmentManager fragManager = activity.getSupportFragmentManager();
FragmentTransaction fragTransacion = fragMgr.beginTransaction();
/****After add , replace fragments
(some of the fragments are add to backstack , some are not)***/
//HERE, How can I get the latest added fragment from backstack ??
android
android-fragments
back-stack
Leem.fin
sumber
sumber
FragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
atauFragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
dokstack
jika saya tidak dapat mengakses fragmen melalui metode pop?fungsi mengembalikan tautan ke atas
Fragment
di backstack. Contoh penggunaan:sumber
Saya pribadi mencoba banyak solusi tersebut dan berakhir dengan solusi yang berfungsi ini:
Tambahkan metode utilitas ini yang akan digunakan beberapa kali di bawah ini untuk mendapatkan jumlah fragmen di backstack Anda:
Kemudian, saat Anda menambahkan / mengganti fragmen menggunakan metode FragmentTransaction, buat tag unik ke fragmen Anda (misalnya: dengan menggunakan jumlah fragmen di tumpukan Anda):
Terakhir, Anda dapat menemukan salah satu fragmen Anda di backstack dengan metode ini:
Oleh karena itu, mengambil fragmen teratas di backstack Anda dapat dengan mudah dilakukan dengan memanggil:
Semoga ini membantu!
sumber
metode pembantu ini mendapatkan fragmen dari atas tumpukan:
sumber
Kotlin
sumber
.lastOrNull()
jikafragments
kosong.Ada daftar fragmen di fragmentMananger. Ketahuilah bahwa menghapus sebuah fragmen, tidak membuat ukuran daftar berkurang (entri fragmen hanya berubah menjadi null). Oleh karena itu, solusi yang valid adalah:
sumber
getFragments()
mengembalikan koleksi fragmen yang dipersingkat. Mungkin yang terakhir terlihat, tapi tidak banyak yang lain.Jawaban yang diberikan oleh deepak goel tidak berhasil untuk saya karena saya selalu mendapatkan null dari
entry.getName()
;Yang saya lakukan adalah menyetel Tag ke fragmen dengan cara ini:
Di mana ft adalah transaksi fragmen saya dan
FRAGMENT_TAG
adalah tag. Kemudian saya menggunakan kode ini untuk mendapatkan fragmen:sumber
Baru saja mengambil jawaban @roghayeh hosseini (benar) dan membuatnya di Kotlin untuk mereka di sini pada tahun 2017 :)
* Ini harus dipanggil dari dalam Aktivitas.
Nikmati :)
sumber
Anda bisa menggunakan getBackStackEntryAt () . Untuk mengetahui berapa banyak entri yang ditahan aktivitas di backstack, Anda bisa menggunakan getBackStackEntryCount ()
sumber
Saya akan menambahkan sesuatu pada jawaban Deepak Goel karena banyak orang, termasuk saya, mendapatkan nilai nol dengan menggunakan metodenya. Rupanya untuk membuat tag berfungsi saat Anda menambahkan fragmen ke backstack Anda harus melakukannya seperti ini:
Anda perlu menambahkan tag yang sama dua kali.
Saya akan berkomentar tetapi saya tidak memiliki 50 reputasi.
sumber
Menjaga tumpukan belakang Anda sendiri:
myBackStack
. Saat AndaAdd
membuat fragmenFragmentManager
, tambahkan juga kemyBackStack
. DionBackStackChanged()
pop darimyBackStack
saat panjangnya lebih darigetBackStackEntryCount
.sumber
Sepertinya ada sesuatu yang berubah menjadi lebih baik, karena kode di bawah berfungsi dengan sempurna untuk saya, tetapi saya tidak menemukannya di jawaban yang sudah disediakan.
Kotlin:
Jawa:
sumber
Jika Anda menggunakan
addToBackStack()
, Anda dapat menggunakan kode berikut.List<Fragment> fragments = fragmentManager.getFragments(); activeFragment = fragments.get(fragments.size() - 1);
sumber
Sebenarnya tidak ada fragmen terbaru yang ditambahkan ke tumpukan karena Anda dapat menambahkan beberapa atau fragmen ke tumpukan dalam satu transaksi atau hanya menghapus fragmen tanpa menambahkan yang baru.
Jika Anda benar-benar ingin memiliki tumpukan fragmen dan dapat mengakses fragmen berdasarkan indeksnya di tumpukan, Anda sebaiknya memiliki lapisan abstraksi di atas
FragmentManager
dan backstacknya. Inilah cara Anda melakukannya:Sekarang bukan menambah dan menghapus fragmen dengan menelepon
FragmentManager
langsung, Anda harus menggunakanpush()
,replace()
danpop()
metodeFragmentStackManager
. Dan Anda akan dapat mengakses fragmen paling atas hanya dengan meneleponstack.get(stack.size() - 1)
.Tetapi jika Anda suka retas, saya harus cara lain untuk melakukan hal serupa. Satu-satunya hal yang harus saya sebutkan adalah bahwa peretasan ini hanya akan berfungsi dengan fragmen dukungan.
Peretasan pertama hanya untuk menambahkan semua fragmen aktif ke pengelola fragmen. Jika Anda hanya mengganti fragmen satu per satu dan mengeluarkannya dari tumpukan, metode ini akan mengembalikan fragmen paling atas:
Pendekatan kedua adalah event more hacky dan memungkinkan Anda untuk mendapatkan semua fragmen yang ditambahkan dalam transaksi terakhir yang
addToBackStack
telah dipanggil:Harap perhatikan bahwa dalam hal ini Anda harus memasukkan kelas ini ke dalam
android.support.v4.app
paket.sumber
Atau Anda bisa menambahkan tag saat menambahkan fragmen yang sesuai dengan kontennya dan menggunakan kolom String statis sederhana (Anda juga dapat menyimpannya dalam paket instance aktivitas dalam metode onSaveInstanceState (Bundle)) untuk menahan tag fragmen yang terakhir ditambahkan dan mendapatkan fragmen byTag () ini kapan pun Anda membutuhkan ...
sumber
Jawaban (Deepak Goel) tertinggi tidak bekerja dengan baik untuk saya. Entah bagaimana, tag tersebut tidak ditambahkan dengan benar.
Saya akhirnya hanya mengirim ID fragmen melalui alur (menggunakan maksud) dan mengambilnya langsung dari pengelola fragmen.
sumber