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 ?
sumber
Jawaban:
Gunakan tag gabungan sebagai root XML Anda
Lihat artikel ini.
sumber
Saya pikir cara Anda seharusnya melakukannya, adalah menggunakan nama kelas Anda sebagai elemen root XML:
Dan kemudian minta kelas Anda diturunkan dari tata letak mana pun yang ingin Anda gunakan. Perhatikan bahwa jika Anda menggunakan metode ini, Anda tidak menggunakan inflater tata letak di sini.
Dan kemudian Anda dapat menggunakan tampilan Anda dalam tata letak XML seperti biasa. Jika Anda ingin membuat tampilan secara terprogram Anda harus mengembang sendiri:
Sayangnya ini tidak memungkinkan Anda melakukannya
v = new MyView(context)
karena sepertinya tidak ada cara untuk mengatasi masalah tata letak bersarang, jadi ini bukan solusi yang lengkap. Anda bisa menambahkan metode seperti iniMyView
untuk membuatnya sedikit lebih bagus:Penafian: Saya mungkin berbicara omong kosong lengkap.
sumber
<com.example.views.MyView />
dan AndasetData
danonFinishInflate
panggilan mulai melemparkan NPEs, dan Anda tidak tahu mengapa.