Android - Setel id fragmen

111

Bagaimana saya bisa mengatur Fragment's Idsehingga saya dapat menggunakan getSupportFragmentManager().findFragmentById(R.id.--)?

tyb
sumber
Anda dapat mengaturnya dalam file layout xml
Vladimir Eremeev

Jawaban:

117

Anda tidak dapat menyetel ID fragmen secara terprogram .

Namun, ada String tagyang 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 ViewGroupakan dimasukkan Fragmentke. Ini tidak begitu berguna untuk tujuan yang saya harapkan Anda miliki, karena ini tidak secara unik mengidentifikasi Fragments, tetapi ViewGroups. ID ini adalah wadah tempat satu atau beberapa fragmen dapat ditambahkan secara dinamis. Menggunakan metode seperti itu untuk mengidentifikasi Fragments akan mengharuskan Anda untuk menambahkan ViewGroups secara dinamis ke Layout untuk setiap FragmentAnda 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 . Fragments tidak perlu Views! Mereka juga dapat digunakan untuk mempertahankan status sementara di antara perubahan konfigurasi!

Thomas Dignan
sumber
Jika saya menggunakan tag dan bukan ID untuk fragmen, bagaimana cara menggunakan panggilan replace yang memerlukan id resource fragmen?
Namratha
12
@TomDignan bagaimana dengan fragmen yang akan ditambahkan di ViewPager? Bagaimana cara mengatur tag-nya? Saya tidak dapat menggunakan transaksi dalam situasi ini.
GuilhE
1
@GuilhE Activity menyediakan metode addFragment () yang bisa Anda rujuk dari viewpager. Menjaga tag sebelum itu bisa dilakukan dengan hashmap.
Thomas Dignan
1
Bisakah jawabannya diedit sedikit untuk menekankan bahwa Anda dapat menyetel id dalam layout xml? Karena saya pribadi tidak membaca pertanyaan lain dan mendapat kesan bahwa tidak ada cara sama sekali untuk menetapkan id ke fragmen ...
Ivan
41

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.

Moral Moose
sumber
4

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.

pengguna2014118
sumber
2

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, DialogFragmentatau 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!

dbm
sumber
0

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);
Jaydev
sumber
Jawaban tidak relevan dengan pertanyaan. Harap perbarui jawabannya. Happy Coding
CodeWithVikas
-1

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

Panos Gr
sumber
-2

Selain jawaban Tom, metode replace juga mendukung tag fragmen, selain menambahkan metode.

oren zvi
sumber