Jawaban:
Anda tidak dapat menyetel ID fragmen secara terprogram .
Namun, ada String tag
yang dapat Anda setel di dalam FragmentTransaction yang dapat digunakan untuk mengidentifikasi Fragmen secara unik.
Sebagai Aleksey menunjukkan, Anda dapat lulus ID untuk FragmentTransaction
's add(int, Fragment)
metode. Namun, ini tidak menentukan ID untuk Fragmen. Ini menentukan ID dari yang ViewGroup
akan dimasukkan Fragment
ke. Ini tidak begitu berguna untuk tujuan yang saya harapkan Anda miliki, karena ini tidak secara unik mengidentifikasi Fragment
s, tetapi ViewGroup
s. ID ini adalah wadah tempat satu atau beberapa fragmen dapat ditambahkan secara dinamis. Menggunakan metode seperti itu untuk mengidentifikasi Fragment
s akan mengharuskan Anda untuk menambahkan ViewGroup
s secara dinamis ke Layout untuk setiap Fragment
Anda menyisipkan. Itu akan sangat merepotkan.
Jadi jika pertanyaan Anda adalah cara membuat pengenal unik untuk Fragment Anda menambahkan dinamis, jawabannya adalah dengan menggunakan FragmentTransaction
's add (int containerViewId, Fragment fragmen, tag String) metode dan FragmentManager
' s findFragmentByTag (String) metode.
Di salah satu aplikasi saya, saya dipaksa untuk membuat string secara dinamis. Tapi itu tidak terlalu mahal dibandingkan dengan FragmentTransaction yang sebenarnya.
Keuntungan lain dari metode tag adalah dapat mengidentifikasi Fragmen yang tidak ditambahkan ke UI. Lihat metode add (Fragment, String) FragmentTransaction . Fragment
s tidak perlu View
s! Mereka juga dapat digunakan untuk mempertahankan status sementara di antara perubahan konfigurasi!
Ternyata Anda mungkin tidak perlu mengetahui id fragmen.
Dari dokumen:
public abstract Fragment findFragmentById (int id)
Finds a fragment that was identified by the given id either
when inflated from XML or as the container ID when added in
a transaction.
Bagian yang penting adalah "sebagai ID penampung saat ditambahkan dalam transaksi".
begitu:
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragment_holder, new AwesomeFragment())
.commit();
lalu
AwesomeFragment awesome = (AwesomeFragment)
getSupportFragmentManager()
.findFragmentById(R.id.fragment_holder);
akan memberi Anda fragmen (keren) apa pun yang disimpan di R.id.fragment_holder.
Dalam kebanyakan kasus, Anda dapat menggunakan tag fragmen serta ID.
Anda dapat menyetel nilai tag di FragmentTransaction.add(Fragment fragment, String tag );
. Kemudian Anda dapat menggunakan perintah FragmentManager.findFragmentByTag(String tab)
untuk menemukan fragmen yang dimaksud.
Seperti yang telah disebutkan Tom dan yang lainnya, ada cara untuk memberi tag pada sebuah fragmen dan menggunakan tag itu untuk identifikasi. Masalah berikutnya yang saya temukan dengan solusi tersebut adalah bahwa fragmen tidak mendapatkan tag hingga dikaitkan dengan Aktivitas (atau, sebenarnya, FragmentManager
). Apa yang harus dilakukan jika seseorang perlu mengidentifikasi fragmen sebelum diberi tag?
Solusi saya sejauh ini semuanya bergantung pada trik (Java) tertua di dunia: buat fragmen template minimalis yang mengambil id di salah satu konstruktornya dan menyediakan getFragmentId()
metode yang mengembalikan id itu. Saya kemudian membiarkan fragmen yang membutuhkan identifikasi awal memperluas template itu dan; voila! Masalah terpecahkan.
Sayangnya, solusi ini mungkin memerlukan sekumpulan fragmen template, satu untuk setiap jenis fragmen ListFragment
, DialogFragment
atau biasa saja Fragment
(POFO ?!) yang memerlukan identifikasi awal. Tetapi ini dapat dikelola dalam kasus fragmen, saya kira, mengingat keuntungan yang diberikan.
Maaf telah merobek luka penyembuhan :-)
Bersulang!
Gunakan yang berikut ini:
Untuk menambahkan fragmen:
getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();
Untuk mengidentifikasi fragmen yang ada:
getFragmentManager().findFragmentByTag(fragmentName);
Saat menggunakan tag, harap pastikan untuk menambahkan
fragmentTransaction.addToBackStack(null);
metode sehingga Fragmen Anda dilanjutkan, bukan dimusnahkan, seperti yang disebutkan dalam panduan pengembang.
Jika Anda tidak memanggil addToBackStack () saat Anda melakukan transaksi yang menghapus fragmen, maka fragmen tersebut akan dimusnahkan saat transaksi dilakukan dan pengguna tidak dapat menavigasi kembali ke sana. Sedangkan, jika Anda memanggil addToBackStack () saat menghapus fragmen, maka fragmen akan dihentikan dan kemudian dilanjutkan jika pengguna menavigasi kembali.
Anda dapat menemukannya di akhir halaman ini .
Saya kehilangan waktu sekitar 30 menit mencoba mencari tahu mengapa Fragmen saya tidak ditemukan melalui findFragmentByTag();
panggilan sederhana