Saya bermain dengan fragmen di Android.
Saya tahu saya dapat mengubah sebuah fragmen dengan menggunakan kode berikut:
FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction fragTrans = fragMgr.beginTransaction();
MyFragment myFragment = new MyFragment(); //my custom fragment
fragTrans.replace(android.R.id.content, myFragment);
fragTrans.addToBackStack(null);
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTrans.commit();
Pertanyaan saya adalah, dalam file Java, bagaimana saya bisa mendapatkan instance Fragment yang sedang ditampilkan?
Jawaban:
Ketika Anda menambahkan fragmen dalam transaksi Anda, Anda harus menggunakan tag.
... dan nanti jika Anda ingin memeriksa apakah fragmennya terlihat:
Lihat juga http://developer.android.com/reference/android/app/Fragment.html
sumber
Saya tahu ini adalah pos lama, tetapi sebelumnya juga mengalami masalah. Menemukan solusi untuk melakukan ini dalam
onBackStackChanged()
fungsi mendengarkanIni bekerja untuk saya karena saya tidak ingin mengulangi setiap fragmen yang harus saya temukan yang terlihat. Semoga ini bisa membantu orang lain juga.
sumber
.getFragmentManager
melaporkan jenis yang tidak kompatibel, seperti yang terjadi dalam kasus saya, itu karena saya menggunakanandroid.support.app.v4.Fragment
, dalam hal ini metode yang tepat untuk digunakan adalahgetSupportFragmentManager
findFragmentByTag()
sebagai penggantifindFragmentById
, jika Anda telah memberikan tag pada fragmen ketika menambahkannya kefragmentManager.beginTransaction() .add(containerID, frag, fragmentTag) .addToBackStack(fragmentTag) .commit();
Berikut adalah solusi saya yang menurut saya berguna untuk skenario fragmen rendah
sumber
fragment
bisa nol dalam skenario tertentu, seperti ketika Anda membuka back stack. Jadi lebih baik digunakanif (fragment != null && fragment.isVisible())
.Setiap kali Anda menunjukkan fragmen, Anda harus meletakkannya di backstack:
Dan kemudian ketika Anda perlu mendapatkan fragmen saat ini Anda dapat menggunakan metode ini:
sumber
addToBackStack(tag)
, tetapi bagaimana jika Anda tidak ingin menambahkan fragmen ke tumpukan belakang?Apa yang saya gunakan untuk menemukan fragmen tampilan saat ini adalah dalam kode di bawah ini. Sederhana dan bekerja untuk saya sekarang. Itu berjalan dalam aktivitas yang menyimpan fragmen
sumber
fragManager.getFragments().size()
bukangetBackStackEntryCount()
karena mereka tidak harus sama (yang merupakan kasus saya). Kalau tidak, Anda bisa mendapatkan crash dengan IndexOutOfBoundsExceptionJalan Kotlin;
sumber
getFragments()
fungsi frameworks , yaitu API 26 dan lebih tinggi.Itu reaktif :
sumber
Metode saya didasarkan pada coba / tangkap seperti ini:
Tapi mungkin ada cara yang lebih baik ...
sumber
Nah, pertanyaan ini mendapat banyak pandangan dan perhatian tetapi masih tidak berisi solusi termudah dari saya - menggunakan getFragments ().
sumber
getSupportFragmentManager().getFragments()
memberi Anda kembali daftar tetapi itu dapat menyimpan nilai nol, jika fragmen terbaru baru saja muncul dari backstack. Persamaan: Jika Anda memeriksa jalan Anda di dalamonBackStackChanged()
metode dan Anda memanggilpopBackStack()
suatu tempat, maka itumCurrentFragment
akan menjadinull
.Anda dapat menanyakan fragmen mana yang dimuat ke dalam bingkai konten Aktivitas Anda, dan mengambil kelas fragmen, atau fragmen 'nama sederhana' (sebagai string).
Pemakaian:
Output:
sumber
Ini agak terlambat, Tetapi bagi siapa saja yang tertarik: Jika Anda mengetahui indeks fragmen yang Anda inginkan di FragmentManager, dapatkan referensi untuk itu dan periksa fungsi isMenuVisible ()! di sini:
Jika ini
true
terlihat oleh pengguna dan seterusnya!sumber
isVisible() == true
,getView() != null
. Plus, dalam kode sayagetBackStackEntryCount
selalu nol. Meskipun saya tidak menggunakan menu,isMenuVisible()
sejauh ini adalah satu-satunya diskriminan yang tampaknya dapat diandalkan untuk fragmen 'aktif' saat ini. ty1)
2)
3)
sumber
Jika sampai di sini dan Anda menggunakan Kotlin:
R.id.fragment_container
adalahid
tempatfragment
presentasi merekaactivity
Atau jika Anda menginginkan solusi yang lebih baik:
sumber
Terinspirasi oleh jawaban Tainy , ini dua sen saya. Sedikit dimodifikasi dari sebagian besar implementasi lainnya.
Ganti
"myActivity"
dengan "ini" jika itu adalah aktivitas Anda saat ini atau gunakan referensi untuk aktivitas Anda.sumber
Ada metode yang disebut
findFragmentById()
diSupportFragmentManager
. Saya menggunakannya dalam wadah aktivitas seperti:Itulah cara mendapatkan arus Anda
Fragment
. Jika Anda memiliki kebiasaanFragment
dan perlu memeriksa apaFragment
itu, saya biasanya menggunakaninstanceof
:sumber
Jika Anda menggunakan
AndroidX Navigation
:Untuk info lebih lanjut tentang komponen navigasi ini: https://developer.android.com/guide/navigation/navigation-getting-started
sumber
your_navhost
.Ini adalah cara sederhana untuk mendapatkan fragmen saat ini ..
sumber
Jawaban Sev bekerja ketika Anda menekan tombol kembali atau mengubah backstack.
Saya melakukan sesuatu yang sedikit berbeda. Saya memiliki pengaturan backstack perubahan pendengar pada basis Fragmen dan fragmen yang diturunkan dan kode ini ada di pendengar:
sumber
Ini bekerja untuk saya. Saya harap ini akan membantu seseorang.
sumber
Jika Anda mendapatkan instance Fragment saat ini dari aktivitas induk, Anda bisa melakukannya
Ini sebenarnya adalah contoh fragmen saat ini yang terisi pada tampilan. Saya memiliki masalah yang sama. Saya harus memuat fragmen yang sama dua kali menjaga satu di backstack.
Metode berikut tidak berfungsi. Itu hanya mendapat Fragmen yang memiliki tag. Jangan buang waktu Anda pada metode ini. Saya yakin ini memiliki kegunaan tetapi untuk mendapatkan versi terbaru dari Fragmen yang sama bukan salah satunya.
sumber
Lihat solusi ini. Ini berhasil bagi saya untuk mendapatkan Fragmen saat ini.
sumber
sumber
Yah, saya kira ini adalah jawaban yang paling mudah untuk pertanyaan ini. Saya harap ini membantu.
sumber
Berikut ini adalah solusi Kotlin:
Cara yang disederhanakan:
sumber
Cara mudah untuk melakukannya:
sumber
Dalam aktivitas utama, metode onAttachFragment (Fragment fragment) dipanggil ketika fragmen baru dilampirkan ke aktivitas. Dalam metode ini, Anda bisa mendapatkan instance dari fragmen saat ini. Namun, metode onAttachFragment tidak dipanggil ketika sebuah fragmen muncul dari backstack, yaitu, ketika tombol kembali ditekan untuk mendapatkan fragmen atas di atas tumpukan. Saya masih mencari metode panggilan balik yang dipicu dalam aktivitas utama ketika sebuah fragmen menjadi terlihat di dalam aktivitas.
sumber
Dalam kasus fragmen yang digulir, ketika instance penggunaan Anda dari kelas ViewPager, misalkan mVeiwPager, Anda dapat memanggil mViewPager.getCurrentItem () untuk mendapatkan nomor int fragmen saat ini.
di MainLayout.xml
di MainActivity.kt
sumber
Saya menemukan
findFragmentByTag
tidak nyaman. Jika adaString currentFragmentTag
diActivity
atau orang tuaFragment
Anda, Anda harus menyimpannyaonSaveInstanceState
dan mengembalikannyaonCreate
. Bahkan jika Anda melakukannya, ketikaActivity
diciptakan,onAttachFragment
akan disebut sebelumonCreate
, sehingga Anda tidak dapat menggunakancurrentFragmentTag
dalamonAttachFragment
(misalnya. Memperbarui beberapa pandangan berdasarkancurrentFragmentTag
), karena kekuatan itu belum dipulihkan.Saya menggunakan kode berikut:
Dokumen
FragmentManager
negara ituKetika Anda perlu melakukan hal-hal berdasarkan jenis fragmen saat ini, cukup gunakan
getCurrentFragment() instance of MyFragment
sajacurrentFragmentTag.equals("my_fragment_tag")
.Perhatikan bahwa
getCurrentFragment()
dionAttachFragment
tidak akan mendapatkan melampirkan tersebutFragment
, tapi yang terpasang sebelumnya.sumber
Saya harus melakukan ini baru-baru ini dan tidak ada jawaban di sini yang cocok dengan skenario ini.
Jika Anda yakin hanya satu fragmen yang akan terlihat (layar penuh), maka sangat ingin menemukan apa yang ada di bagian atas backstack. Misalnya, sebagai
Kotlin
untukFragment
:Dan gunakan seperti:
sumber
Anda dapat melakukannya dengan sangat mudah juga dengan URL di logcat yang akan mengarahkan Anda ke kode sumber kode sumber fragmen saat ini. Pertama, Anda perlu menambahkan OnBackStackChangedListener dalam aktivitas host seperti -
Dan implementasi OnBackStackChangedListener adalah -
Dan metode getStackTopName () adalah -
sumber