Bagaimana cara mendeklarasikan elemen Android UI menggunakan XML?
xml
android
user-interface
Casebash
sumber
sumber
Jawaban:
Panduan Pengembang Android memiliki bagian yang disebut Membangun Komponen Kustom . Sayangnya, pembahasan atribut XML hanya mencakup mendeklarasikan kontrol di dalam file layout dan tidak benar-benar menangani nilai-nilai di dalam inisialisasi kelas. Langkah-langkahnya adalah sebagai berikut:
1. Nyatakan atribut dalam
values\attrs.xml
Perhatikan penggunaan nama yang tidak berkualitas dalam
declare-styleable
tag. Atribut android non-standar sepertiextraInformation
harus dideklarasikan. Tag yang dideklarasikan dalam superclass akan tersedia dalam subclass tanpa harus dideklarasikan ulang.2. Buat konstruktor
Karena ada dua konstruktor yang menggunakan
AttributeSet
inisialisasi untuk, lebih mudah untuk membuat metode inisialisasi terpisah untuk memanggil konstruktor.R.styleable.MyCustomView
adalahint[]
sumber daya yang dibuat secara otomatis di mana setiap elemen adalah ID dari suatu atribut. Atribut dihasilkan untuk setiap properti dalam XML dengan menambahkan nama atribut ke nama elemen. Misalnya,R.styleable.MyCustomView_android_text
berisiandroid_text
atribut untukMyCustomView
. Atribut kemudian dapat diambil dariTypedArray
menggunakan berbagaiget
fungsi. Jika atribut tidak didefinisikan dalam XML yang didefinisikan, makanull
dikembalikan. Kecuali, tentu saja, jika jenis kembali adalah primitif, dalam hal ini argumen kedua dikembalikan.Jika Anda tidak ingin mengambil semua atribut, dimungkinkan untuk membuat larik ini secara manual. ID untuk atribut android standar disertakan
android.R.attr
, sementara atribut untuk proyek ini ada diR.attr
.Harap dicatat bahwa Anda tidak boleh menggunakan apa pun di
android.R.styleable
, karena utas ini dapat berubah di masa mendatang. Masih dalam dokumentasi sebagai melihat semua konstanta ini di satu tempat berguna.3. Gunakan dalam file tata letak seperti
layout\main.xml
Sertakan deklarasi namespace
xmlns:app="http://schemas.android.com/apk/res-auto"
di elemen xml tingkat atas. Namespaces menyediakan metode untuk menghindari konflik yang terkadang terjadi ketika skema berbeda menggunakan nama elemen yang sama (lihat artikel ini untuk info lebih lanjut). URL hanyalah cara mengidentifikasi skema unik - tidak ada yang perlu di-host di URL itu . Jika ini tampaknya tidak melakukan apa-apa, itu karena Anda sebenarnya tidak perlu menambahkan awalan namespace kecuali Anda perlu menyelesaikan konflik.Referensi tampilan khusus menggunakan nama yang memenuhi syarat.
Contoh Android LabelView
Jika Anda ingin contoh lengkap, lihat contoh tampilan label android.
LabelView.java
attrs.xml
custom_view_1.xml
Ini terkandung dalam
LinearLayout
dengan atribut namespace:xmlns:app="http://schemas.android.com/apk/res-auto"
Tautan
sumber
Referensi yang bagus. Terima kasih! Tambahan untuk itu:
Jika Anda kebetulan memiliki proyek perpustakaan termasuk yang telah menyatakan atribut khusus untuk tampilan kustom, Anda harus mendeklarasikan namespace proyek Anda, bukan yang perpustakaan. Misalnya:
Mengingat bahwa perpustakaan memiliki paket "com.example.library.customview" dan proyek yang bekerja memiliki paket "com.example.customview", maka:
Tidak akan berfungsi (menunjukkan kesalahan "kesalahan: Tidak ditemukan pengidentifikasi sumber daya untuk atribut 'newAttr' dalam paket 'com.example.library.customview'"):
Akan bekerja:
sumber
xmlns:app="http://schemas.android.com/apk/res-auto"
Lihat komentar 57 di code.google.com/p/android/issues/detail?id=9656Suspicious namespace: Did you mean http://schemas.android.com/apk/res-auto
res-auto
karena kami menggunakan Android Studio dan Gradle. Kalau tidak (misalnya beberapa versi Eclipse) biasanya akan berakhir denganlib/[your package name]
. yaituhttp://schemas.android.com/apk/lib/[your package name]
Selain jawaban yang paling banyak dipilih.
memperolehStyledAttributes ()
Saya ingin menambahkan beberapa kata tentang penggunaan diperolehStyledAttributes (), ketika kita membuat tampilan khusus menggunakan atribut android: xxx prdefined. Terutama ketika kita menggunakan TextAppearance.
Seperti yang disebutkan dalam "2. Membuat konstruktor", tampilan kustom mendapat AttributeSet pada pembuatannya. Penggunaan utama dapat kita lihat dalam kode sumber TextView (API 16).
Apa yang bisa kita lihat di sini?
obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes)
Set atribut diproses berdasarkan tema sesuai dengan dokumentasi. Nilai atribut dikompilasi langkah demi langkah. Atribut pertama diisi dari tema, lalu nilai-nilai digantikan oleh nilai-nilai dari gaya, dan akhirnya nilai yang tepat dari XML untuk tampilan contoh khusus menggantikan yang lain.
Array atribut yang diminta -
com.android.internal.R.styleable.TextView
Ini adalah array konstanta biasa. Jika kami meminta atribut standar, kami dapat membuat array ini secara manual.
Apa yang tidak disebutkan dalam dokumentasi - urutan elemen TypedArray hasil.
Ketika tampilan kustom dideklarasikan di attrs.xml, konstanta khusus untuk indeks atribut dihasilkan. Dan kita dapat mengekstrak nilai-nilai seperti ini:
a.getString(R.styleable.MyCustomView_android_text)
. Tetapi untuk manualint[]
tidak ada konstanta. Saya kira, bahwa getXXXValue (arrayIndex) akan berfungsi dengan baik.Dan pertanyaan lain adalah: "Bagaimana kita bisa mengganti konstanta internal, dan meminta atribut standar?" Kita bisa menggunakan nilai android.R.attr. *.
Jadi jika kita ingin menggunakan atribut TextAppearance standar dalam tampilan kustom dan membaca nilainya dalam konstruktor, kita dapat memodifikasi kode dari TextView dengan cara ini:
Di mana CustomLabel didefinisikan:
Mungkin, saya keliru dalam beberapa hal, tetapi dokumentasi Android tentang memperolehStyledAttributes () sangat buruk.
Memperluas komponen UI standar
Pada saat yang sama kita dapat memperluas komponen UI standar, menggunakan semua atribut yang dideklarasikan. Pendekatan ini tidak begitu baik, karena TextView misalnya menyatakan banyak properti. Dan tidak mungkin untuk mengimplementasikan fungsionalitas penuh di override onMeasure () dan onDraw ().
Tetapi kita dapat mengorbankan penggunaan kembali yang luas secara teoritis dari komponen khusus. Katakan "Saya tahu persis fitur apa yang akan saya gunakan", dan jangan berbagi kode dengan siapa pun.
Kemudian kita dapat mengimplementasikan konstruktor
CustomComponent(Context, AttributeSet, defStyle)
. Setelah memanggilsuper(...)
kita akan memiliki semua atribut diuraikan dan tersedia melalui metode pengambil.sumber
Tampaknya Google telah memperbarui halaman pengembangnya dan menambahkan berbagai pelatihan di sana.
Salah satunya berkaitan dengan pembuatan tampilan khusus dan dapat ditemukan di sini
sumber
Terima kasih banyak atas jawaban pertama.
Sedangkan saya, saya hanya punya satu masalah dengan itu. Ketika menggembungkan pandangan saya, saya memiliki bug: java.lang.NoSuchMethodException: MyView (Konteks, Atribut)
Saya mengatasinya dengan membuat konstruktor baru:
Semoga ini bisa membantu!
sumber
Anda dapat memasukkan file tata letak apa pun di file tata letak lainnya sebagai-
di sini file layout di tag include adalah file layout .xml lainnya di folder res yang sama.
sumber