Saya ingin tahu apakah ini sebenarnya bug di API Android:
Saya memiliki pengaturan seperti ini:
┌----┬---------┐
| | |
| 1 | 2 |
| |┌-------┐|
| || ||
| || 3 ||
└----┴┴-------┴┘
- Adalah menu yang memuat fragmen # 2 (Layar pencarian) di panel kanan.
- Adalah layar pencarian yang berisi fragmen # 3, yang merupakan daftar hasil.
- Daftar hasil digunakan di beberapa tempat (termasuk sebagai fragmen tingkat tinggi yang berfungsi dengan haknya sendiri).
Fungsionalitas ini berfungsi dengan baik pada telepon (Di mana 1 & 2 dan 3 adalah ActivityFragment
s).
Namun, ketika saya menggunakan kode ini:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment frag = new FragmentNumber2();
if(toLoad != null) frag.setArguments(toLoad);
transaction.replace(R.id.rightPane, frag);
transaction.commit();
Di mana R.id.leftPane
dan R.id.rightPane
berada <fragment>
dalam tata letak linier horizontal.
Ini adalah pemahaman saya bahwa kode di atas menghapus fragmen yang penduduk dan kemudian menggantinya dengan fragmen baru. Brilliant ... Jelas bukan itu yang terjadi karena ketika kode ini berjalan kedua kalinya Anda mendapatkan pengecualian berikut:
07-27 15:22:55.940: ERROR/AndroidRuntime(8105): Caused by: java.lang.IllegalArgumentException: Binary XML file line #57: Duplicate id 0x7f080024, tag null, or parent id 0x0 with another fragment for FragmentNumber3
Ini disebabkan karena wadah untuk FragmentNumber3 telah digandakan dan tidak lagi memiliki ID unik. Fragmen awal belum dihancurkan (?) Sebelum yang baru ditambahkan (dalam pikiran saya itu berarti belum diganti ).
Dapatkah seseorang memberi tahu saya jika ini mungkin ( jawaban ini menunjukkan tidak) atau ini bug?
Jawaban:
Fragmen bersarang saat ini tidak didukung. Mencoba memasukkan fragmen ke dalam UI dari fragmen lain akan menghasilkan perilaku yang tidak terdefinisi dan kemungkinan rusak.
CATATAN (sesuai dokumen ini ): " Catatan: Anda tidak dapat mengembang tata letak menjadi fragmen ketika tata letak itu mencakup a
<fragment>
. Fragmen bersarang hanya didukung ketika ditambahkan ke fragmen secara dinamis. "sumber
Fragment
sekarang menjadi bagian dari API Android, yay! developer.android.com/about/versions/… .Pustaka Dukungan Android juga sekarang mendukung fragmen bersarang , sehingga Anda dapat menerapkan desain fragmen bertingkat pada Android 1.6 dan lebih tinggi.
Untuk membuat fragmen, cukup panggil getChildFragmentManager () pada Fragmen tempat Anda ingin menambahkan fragmen. Ini mengembalikan FragmentManager yang dapat Anda gunakan seperti biasa dari aktivitas tingkat atas untuk membuat transaksi fragmen. Misalnya, inilah beberapa kode yang menambahkan fragmen dari dalam kelas Fragmen yang ada:
Untuk mendapatkan lebih banyak gagasan tentang fragmen bersarang, silakan kunjungi tutorial ini
Bagian 1
Bagian 2
Bagian 3
dan di sini ada posting SO yang membahas tentang praktik terbaik untuk fragmen bersarang .
sumber
.. Anda dapat membersihkan fragmen bersarang Anda di metode fragmen induk
destroyview
:sumber
Saya memiliki aplikasi yang sedang saya kembangkan yang ditata mirip dengan Tab di Action Bar yang meluncurkan fragmen, beberapa Fragmen ini memiliki beberapa Fragmen yang tertanam di dalamnya.
Saya mendapatkan kesalahan yang sama ketika saya mencoba menjalankan aplikasi. Sepertinya jika Anda instantiate Fragmen dalam tata letak xml setelah tab tidak dipilih dan kemudian dipilih kembali saya akan mendapatkan kesalahan inflator.
Saya memecahkan masalah ini dengan mengganti semua fragmen dalam xml dengan Linearlayouts dan kemudian menggunakan manajer fragmen / transaksi fragmen untuk instantiate fragmen yang semuanya berfungsi dengan baik setidaknya pada tingkat pengujian sekarang.
Saya harap ini membantu Anda.
sumber
Saya telah menghadapi masalah yang sama, telah berjuang beberapa hari dengannya dan harus mengatakan bahwa cara paling mudah untuk mengatasinya saya menemukan ini adalah dengan menggunakan fragment.hide () / fragment.show () ketika tab dipilih / tidak dipilih ().
Ketika rotasi layar terjadi, semua fragmen orangtua dan anak dihancurkan dengan benar.
Pendekatan ini juga memiliki satu keuntungan tambahan - menggunakan hide () / show () tidak menyebabkan tampilan fragmen kehilangan statusnya, jadi tidak perlu mengembalikan posisi gulir sebelumnya untuk ScrollViews misalnya.
Masalahnya adalah saya tidak tahu apakah itu benar untuk tidak melepaskan fragmen ketika mereka tidak terlihat. Saya pikir contoh resmi TabListener dirancang dengan pemikiran bahwa fragmen dapat digunakan kembali dan Anda tidak boleh mencemari memori mereka, namun, saya pikir jika Anda hanya memiliki beberapa tab dan Anda tahu bahwa pengguna akan sering berpindah di antaranya. akan sesuai untuk membuatnya melekat pada aktivitas saat ini.
Saya ingin mendengar komentar dari pengembang yang lebih berpengalaman.
sumber
Jika Anda menemukan fragmen bersarang Anda tidak dihapus atau digandakan (mis. Saat Activity restart, on rotate screen) coba ubah:
untuk
Jika di atas tidak membantu, coba:
Belajar di sini
sumber