Di saya main.xml
miliki
<FrameLayout
android:id="@+id/frameTitle"
android:padding="5dp"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:background="@drawable/title_bg">
<fragment
android:name="com.fragment.TitleFragment"
android:id="@+id/fragmentTag"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</FrameLayout>
Dan saya mengatur objek fragmen seperti ini
FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new FragmentType1();
fragmentTransaction.replace(R.id.frameTitle, casinodetailFragment, "fragmentTag");
// fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Ini mengatur berbagai jenis objek Fragmen ( FragmentType2,FragmentType3,...
) pada waktu yang berbeda. Sekarang di beberapa titik waktu saya perlu mengidentifikasi objek mana yang saat ini ada.
Dalam singkat saya perlu melakukan sesuatu seperti ini:
Fragment currentFragment = //what is the way to get current fragment object in FrameLayout R.id.frameTitle
Saya mencoba yang berikut ini
TitleFragment titleFragmentById = (TitleFragment) fragmentManager.findFragmentById(R.id.frameTitle);
dan
TitleFragment titleFragmentByTag = (TitleFragment) fragmentManager.findFragmentByTag("fragmentTag");
Tetapi kedua objek (titleFragmentById dan titleFragmentByTag) adalahnull
Apakah saya melewatkan sesuatu?
Saya menggunakan Compatibility Package, r3
dan mengembangkan untuk API level 7
.
findFragmentById()
dan findFragmentByTag()
akan bekerja jika kita telah menetapkan fragmen menggunakan fragmentTransaction.replace
atau fragmentTransaction.add
, tetapi akan return null
jika kita telah menetapkan objek di xml (seperti apa yang telah saya lakukan di saya main.xml
). Saya pikir saya kehilangan sesuatu di file XML saya.
sumber
Jawaban:
Sebut
findFragmentById()
diFragmentManager
dan menentukan fragmen dalam AndaR.id.frameTitle
kontainer.sumber
fragmentTransaction.replac
e ataufragmentTransaction.add
tetapi tidak akan mendapatkan jika kita telah menyetelnya di xml. Lihat hasil edit saya 2findFragmentByTag
mengembalikan null untukActionBar
Tab. DalamActivity
perpanjanganActionBarActivity
saya, saya pertama-tama menambahkan tabActionBar
dan kemudian menemukannya!executePendingTransactions()
padaFragmentManager
setelah meneleponcommit()
pada transaksi, meskipun saya belum mencoba ini. Atau Anda dapat menggunakansetContentView()
untuk menggunakan file tata letak dengan<fragment>
tag. Salah satu dari itu terjadi secara serempak, sehingga fragmen akan ada dalamonCreate()
panggilan itu sendiri di mana Anda menggunakanexecutePendingTransaction()
atausetContentView()
. Kalau tidak, biasaFragmentTransaction
diproses secara tidak sinkron, dan itu bahkan tidak akan dimulai pada saatonCreate()
berakhir.Coba ini,
ini akan memberi Anda fragmen saat ini, maka Anda dapat membandingkannya dengan kelas fragmen dan melakukan tugas Anda.
sumber
getSupportFragmentManager()
sebagai gantinya, dan akan mendapatkan nol tanpasupport
bagianSaya pikir Anda dapat menggunakan event onAttachFragment mungkin berguna untuk menangkap fragmen mana yang aktif.
sumber
Saya pikir Anda harus melakukan:
Alasannya adalah karena Anda mengatur tag "fragmentTag" ke fragmen terakhir yang telah Anda tambahkan (saat Anda menelepon ganti).
sumber
fragmentTransaction.replac
e ataufragmentTransaction.add
tetapi tidak akan mendapatkan jika kita telah menyetelnya di xml. Lihat hasil edit saya 2fragmentTag
tag untuk fragmen saat ini?Anda bisa mendapatkan daftar fragmen dan melihat yang terakhir.
Tetapi terkadang (ketika Anda menavigasi kembali) ukuran daftar tetap sama tetapi beberapa elemen terakhir adalah nol. Jadi dalam daftar saya beralih ke fragmen bukan nol terakhir dan menggunakannya.
sumber
getFragments()
metode ini. Itu ditandai dengan@hide
dan tidak seharusnya disertakan dengan jar perpustakaan dukungan. Seharusnya tidak dianggap sebagai bagian dari API yang diekspor.getFragments()
dilakukan, karena Anda cukup sering membutuhkannya. Saya pikir itu sebenarnya tersedia untuk umum sekarang juga.Ini adalah solusi paling sederhana dan berhasil untuk saya.
1.) Anda menambahkan fragmen Anda
2.)
sumber
Mungkin terlambat tapi saya harap ini membantu orang lain, juga @CommonsWare telah memposting jawaban yang benar.
sumber
Mungkin cara paling sederhana adalah:
Ini berhasil untuk saya
sumber
Anda dapat membuat bidang di Kelas Aktivitas induk Anda:
Dan kemudian di dalam setiap kelas fragmen:
Bidang 'fr' Anda adalah Objek fragmen saat ini
Ini bekerja juga dengan popBackStack ()
sumber
Saya tahu ini sudah lama, tapi saya akan di sini kalau-kalau ini membantu seseorang keluar.
The jawaban yang tepat sejauh ini adalah (dan yang dipilih) satu dari CommonsWare. Saya mengalami masalah yang sama seperti yang diposting, berikut ini
terus mengembalikan nol. Kesalahan saya benar-benar konyol, dalam file xml saya:
Kesalahannya adalah saya punya android: tag BUKAN DARI android: id .
sumber
@Hammer response bekerja untuk saya, saya gunakan untuk mengontrol tombol aksi mengambang
sumber
Jika Anda memperluas dari AbstractActivity, Anda bisa menggunakan metode getFragments ():
sumber
Jika Anda mendefinisikan fragmen dalam tata letak XML aktivitas, maka
Activity
pastikan Anda meneleponsetContentView()
sebelum meneleponfindFragmentById()
.sumber
Jika Anda menggunakan BackStack ... dan ONLY jika Anda menggunakan back stack, cobalah ini:
sumber
Ini akan memberi Anda nama kelas fragmen saat ini ->
sumber
Lakukan pemeriksaan (fragmen mana dalam wadah aktivitas) dalam metode onStart;
Beberapa cek:
sumber