Aplikasi Android yang saya kembangkan saat ini memiliki aktivitas utama yang telah berkembang cukup besar. Ini terutama karena mengandung TabWidget
3 tab. Setiap tab memiliki beberapa komponen. Kegiatan harus mengendalikan semua komponen itu sekaligus. Jadi saya pikir Anda dapat membayangkan bahwa Kegiatan ini memiliki 20 bidang (bidang untuk hampir setiap komponen). Juga mengandung banyak logika (klik pendengar, logika untuk mengisi daftar, dll).
Apa yang biasanya saya lakukan dalam kerangka kerja berbasis komponen adalah untuk membagi semuanya menjadi komponen kustom. Setiap komponen khusus akan memiliki tanggung jawab yang jelas. Ini akan berisi kumpulan komponennya sendiri dan semua logika lain yang terkait dengan komponen itu.
Saya mencoba mencari tahu bagaimana hal ini dapat dilakukan, dan saya menemukan sesuatu dalam dokumentasi Android yang mereka suka menyebutnya "Kontrol Senyawa". (Lihat http://developer.android.com/guide/topics/ui/custom-components.html#compound dan gulir ke bagian "Kontrol Senyawa") Saya ingin membuat komponen seperti itu berdasarkan file XML yang mendefinisikan struktur tampilan.
Dalam dokumentasi itu tertulis:
Perhatikan bahwa seperti halnya dengan suatu Kegiatan, Anda dapat menggunakan pendekatan deklaratif (berbasis XML) untuk membuat komponen yang terkandung, atau Anda dapat membuat sarang secara terprogram dari kode Anda.
Nah, itu kabar baik! Pendekatan berbasis XML persis seperti yang saya inginkan! Tapi itu tidak mengatakan bagaimana melakukannya, kecuali bahwa itu "seperti dengan Aktivitas" ... Tapi apa yang saya lakukan dalam suatu Aktivitas adalah panggilan setContentView(...)
untuk mengembang pandangan dari XML. Metode itu tidak tersedia jika Anda misalnya subkelas LinearLayout
.
Jadi saya mencoba mengembang XML secara manual seperti ini:
public class MyCompoundComponent extends LinearLayout {
public MyCompoundComponent(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.my_layout, this);
}
}
Ini berfungsi, kecuali fakta bahwa XML yang saya muat telah LinearLayout
mendeklarasikan sebagai elemen root. Ini menghasilkan peningkatan LinearLayout
menjadi anak MyCompoundComponent
yang sudah menjadi LinearLayout
!! Jadi sekarang kita memiliki LinearLayout yang berlebihan di antara MyCompoundComponent
dan pandangan yang sebenarnya dibutuhkan.
Bisakah seseorang memberi saya cara yang lebih baik untuk mendekati ini, menghindari LinearLayout
instantiated yang berlebihan ?