Saya sedang menulis aplikasi untuk tablet 4.0 dan 4.1, yang saya tidak ingin menggunakan pustaka dukungan (jika tidak diperlukan) tetapi hanya karena itu api 4.x.
Jadi platform target saya didefinisikan dengan sangat baik sebagai:> = 4.0 dan <= 4.1
Aplikasi memiliki tata letak multi-panel (dua fragmen, satu fragmen kecil di kiri, satu fragmen konten di kanan) dan bilah tindakan dengan tab.
Mirip dengan ini:
Mengklik tab pada bilah tindakan akan mengubah fragmen 'luar', dan fragmen bagian dalam adalah fragmen dengan dua fragmen bersarang (1. fragmen daftar kiri kecil, 2. fragmen konten lebar).
Sekarang saya bertanya-tanya apa praktik terbaik untuk mengganti fragmen dan terutama fragmen bersarang. ViewPager adalah bagian dari pustaka dukungan, tidak ada alternatif 4.x asli untuk kelas ini. Tampak seperti 'deprecated' dalam pengertian saya. - http://developer.android.com/reference/android/support/v4/view/ViewPager.html
Kemudian saya membaca catatan rilis untuk Android 4.2, mengenai ChildFragmentManager
, mana yang cocok, tetapi saya menargetkan 4.0 dan 4.1, jadi ini juga tidak dapat digunakan.
ChildFragmentManager
hanya tersedia di 4.2
- http://developer.android.com/about/versions/android-4.2.html#NestedFragments
- http://developer.android.com/reference/android/app/Fragment.html#getChildFragmentManager ()
Sayangnya, hampir tidak ada contoh bagus di luar sana yang menunjukkan praktik terbaik untuk penggunaan fragmen tanpa pustaka dukungan, bahkan di seluruh panduan pengembang Android; dan terutama tidak tentang fragmen bersarang.
Jadi saya bertanya-tanya: apakah tidak mungkin untuk menulis 4.1 aplikasi dengan fragmen bersarang tanpa menggunakan pustaka dukungan dan semua yang menyertainya? (perlu menggunakan FragmentActivity, bukan Fragment, dll.?) Atau apa praktik terbaiknya?
Masalah yang saya hadapi saat ini dalam pengembangan adalah pernyataan ini:
Android Support Library juga sekarang mendukung fragmen bersarang, sehingga Anda bisa mengimplementasikan desain fragmen bertingkat pada Android 1.6 dan yang lebih tinggi.
Catatan: Anda tidak bisa memekarkan tata letak menjadi fragmen jika tata letak itu menyertakan file
<fragment>
. Fragmen bertingkat hanya didukung saat ditambahkan ke fragmen secara dinamis.
Karena saya menempatkan define fragmen bersarang di XML, yang ternyata menyebabkan kesalahan seperti:
Caused by: java.lang.IllegalArgumentException: Binary XML file line #15: Duplicate id 0x7f090009, tag frgCustomerList, or parent id 0x7f090008 with another fragment for de.xyz.is.android.fragment.CustomerListFragment_
Saat ini, saya menyimpulkan sendiri: bahkan pada 4.1, ketika saya bahkan tidak ingin menargetkan platform 2.x, fragmen bersarang seperti yang ditunjukkan pada tangkapan layar tidak mungkin dilakukan tanpa pustaka dukungan.
(Ini mungkin sebenarnya lebih merupakan entri wiki daripada pertanyaan, tapi mungkin orang lain telah mengelolanya sebelumnya).
Memperbarui:
Jawaban yang membantu ada di: Fragment Inside Fragment
sumber
ActionBar
(dibangun di rumah oleh Samsung). Lihat lebih dekat ActionBarSherlock, ia memiliki tab di ActionBar jika ada ruang.Jawaban:
Batasan
Jadi, menumpuk fragmen di dalam fragmen lain tidak dimungkinkan dengan xml apa pun versi
FragmentManager
Anda gunakan.Jadi, Anda harus menambahkan fragmen melalui kode, ini mungkin tampak seperti masalah, tetapi dalam jangka panjang membuat tata letak Anda menjadi sangat fleksibel.
Jadi bersarang tanpa menggunakan
getChildFragmentManger
? Esensi di baliknyachildFragmentManager
adalah bahwa ia menunda pemuatan sampai transaksi fragmen sebelumnya telah selesai. Dan tentu saja itu hanya didukung secara alami di 4.2 atau pustaka dukungan.Bersarang tanpa ChildManager - Solusi
Solusi, Tentu! Saya telah melakukan ini untuk waktu yang lama sekarang, (sejak
ViewPager
diumumkan).Lihat di bawah; Ini adalah
Fragment
yang menunda pemuatan, jadiFragment
s dapat dimuat di dalamnya.Ini cukup sederhana,
Handler
ini adalah kelas yang sangat berguna, secara efektif penangan menunggu ruang untuk dieksekusi pada utas utama setelah transaksi fragmen saat ini selesai dilakukan (karena fragmen mengganggu UI yang mereka jalankan di utas utama).Saya tidak akan menganggapnya sebagai 'praktik terbaik', tetapi saya memiliki aplikasi langsung menggunakan peretasan ini dan saya belum mengalami masalah apa pun dengannya.
Saya juga menggunakan metode ini untuk menyematkan pager tampilan - https://gist.github.com/chrisjenx/3405429
sumber
fragment
elemen, Anda akan menimpa implementasi super dan mencoba mengurai / mengembangkannya sendiri. Tapi itu akan menjadi BANYAK usaha, Nah di luar cakupan pertanyaan StackOverflow.Cara terbaik untuk melakukan ini di pra-API 17 adalah dengan tidak melakukannya sama sekali. Mencoba menerapkan perilaku ini akan menimbulkan masalah. Namun itu tidak berarti bahwa itu tidak dapat dipalsukan secara meyakinkan menggunakan API 14 saat ini. Apa yang saya lakukan adalah sebagai berikut:
1 - lihat komunikasi antar fragmen http://developer.android.com/training/basics/fragments/communicating.html
2 - pindahkan tata letak xml FrameLayout Anda dari Fragmen yang ada ke tata letak Aktivitas dan sembunyikan dengan memberikan ketinggian 0:
3 - Implementasikan antarmuka di Fragmen induk
4 - Implementasikan antarmuka di Aktivitas induk
public class YourActivity extends Activity mengimplementasikan yourParentFragment.OnListener {
}
5 - Selamat menikmati, dengan metode ini Anda mendapatkan fungsi fluid yang sama seperti fungsi getChildFragmentManager () di lingkungan pra-API 17. Seperti yang Anda ketahui, fragmen turunan sebenarnya bukan lagi turunan dari fragmen induk tetapi sekarang menjadi turunan aktivitas, hal ini benar-benar tidak dapat dihindari.
sumber
Saya harus berurusan dengan masalah yang tepat ini karena kombinasi NavigationDrawer, TabHost, dan ViewPager yang mengalami komplikasi dengan penggunaan pustaka dukungan karena TabHost. Dan kemudian saya juga harus mendukung min API JellyBean 4.1, jadi menggunakan fragmen bersarang dengan getChildFragmentManager bukanlah pilihan.
Jadi masalah saya bisa disaring ke ...
Solusi saya adalah menciptakan ilusi fragmen bersarang tanpa benar-benar membuat fragmen bersarang. Saya melakukan ini dengan membuat aktivitas utama menggunakan TabHost DAN ViewPager untuk mengelola dua Tampilan bersaudara yang visibilitasnya dikelola dengan mengubah layout_weight antara 0 dan 1.
Ini secara efektif memungkinkan "Fragmen Tersarang" palsu saya untuk beroperasi sebagai tampilan independen selama saya mengelola bobot tata letak yang relevan secara manual.
Inilah activity_main.xml saya:
Perhatikan bahwa "@ + id / pager" dan "@ + id / container" adalah saudara dengan 'android: layout_weight = "0.5"' dan 'android: layout_height = "0dp"'. Ini agar saya dapat melihatnya di pratinjau untuk ukuran layar apa pun. Bobotnya akan dimanipulasi dalam kode selama runtime.
sumber
SO
bahwa menggunakanActionBar
tab dengan aNavigation Drawer
tidak baik karena secara otomatis akan menempatkan tab di atas tampilan laci Anda. Maaf, saya tidak memiliki link untuk membuat cadangan ini.Berdasarkan jawaban @ Chris.Jenkins, ini adalah solusi yang telah bekerja dengan baik untuk saya, untuk menghapus fragmen selama peristiwa siklus hidup (yang memiliki kecenderungan untuk memunculkan IllegalStateExceptions). Ini menggunakan kombinasi pendekatan Handler, dan pemeriksaan Activity.isFinishing () (jika tidak maka akan memunculkan kesalahan untuk "Tidak dapat melakukan tindakan ini setelah onSaveInstanceState).
Pemakaian:
sumber
Meskipun OP mungkin memiliki keadaan khusus yang mencegahnya menggunakan Pustaka Dukungan, kebanyakan orang harus menggunakannya. Dokumentasi Android merekomendasikannya, dan itu akan membuat aplikasi Anda tersedia untuk audiens seluas mungkin.
Dalam jawaban lengkap saya di sini, saya membuat contoh yang mendemonstrasikan cara menggunakan fragmen bersarang dengan pustaka dukungan.
sumber