Saya perlu menerapkan atribut saya sendiri seperti di com.android.R.attr
Tidak menemukan apa pun dalam dokumentasi resmi sehingga saya memerlukan informasi tentang cara mendefinisikan attrs ini dan cara menggunakannya dari kode saya.
android
android-resources
android-attributes
Alexander Oleynikov
sumber
sumber
Jawaban:
Saat ini dokumentasi terbaik adalah sumbernya. Anda dapat melihatnya di sini (attrs.xml) .
Anda bisa mendefinisikan atribut di
<resources>
elemen atas atau di dalam<declare-styleable>
elemen. Jika saya akan menggunakan attr di lebih dari satu tempat saya letakkan di elemen root. Catatan, semua atribut memiliki namespace global yang sama. Itu berarti bahwa bahkan jika Anda membuat atribut baru di dalam<declare-styleable>
elemen itu dapat digunakan di luarnya dan Anda tidak dapat membuat atribut lain dengan nama yang sama dari tipe yang berbeda.Suatu
<attr>
elemen memiliki dua atribut xmlname
danformat
.name
memungkinkan Anda menyebutnya sesuatu dan ini adalah bagaimana Anda akhirnya menyebutnya dalam kode, misalnyaR.attr.my_attribute
,. Theformat
atribut dapat memiliki nilai yang berbeda tergantung pada 'jenis' atribut yang Anda inginkan.Anda dapat mengatur format ke beberapa jenis dengan menggunakan
|
, misalnyaformat="reference|color"
,.enum
atribut dapat didefinisikan sebagai berikut:flag
atribut serupa kecuali nilai-nilai perlu didefinisikan sehingga mereka dapat digigit bersama:Selain atribut ada
<declare-styleable>
elemen. Ini memungkinkan Anda untuk mendefinisikan atribut yang bisa digunakan tampilan kustom. Anda melakukan ini dengan menentukan<attr>
elemen, jika sebelumnya ditentukan Anda tidak menentukanformat
. Jika Anda ingin menggunakan kembali Android attr, misalnya, Android: Gravity, maka Anda dapat melakukannya diname
, sebagai berikut.Contoh tampilan khusus
<declare-styleable>
:Ketika mendefinisikan atribut khusus Anda dalam XML pada tampilan kustom Anda, Anda perlu melakukan beberapa hal. Pertama, Anda harus mendeklarasikan namespace untuk menemukan atribut Anda. Anda melakukan ini pada elemen tata letak root. Biasanya hanya ada
xmlns:android="http://schemas.android.com/apk/res/android"
. Anda sekarang juga harus menambahkanxmlns:whatever="http://schemas.android.com/apk/res-auto"
.Contoh:
Terakhir, untuk mengakses atribut khusus yang biasanya Anda lakukan di konstruktor tampilan kustom Anda sebagai berikut.
Tamat. :)
sumber
View
: github.com/commonsguy/cw-advandroid/tree/master/Views/…xmlns:my="http://schemas.android.com/apk/lib/my.namespace"
- tanpa menyalin attrs.xml. Perhatikan bahwa jalur URI namespace harus / apk / * lib * not / apk / res.apk/lib
triknya tidak berfungsi untuk saya pada atribut khusus dengan format referensi dari proyek perpustakaan. Apa yang melakukan pekerjaan adalah untuk digunakanapk/res-auto
, seperti yang disarankan dalam stackoverflow.com/a/13420366/22904 tepat di bawah dan juga di stackoverflow.com/a/10217752enum
danflag
: yang pertama memungkinkan kita memilih satu dan hanya satu nilai, yang terakhir memungkinkan kita menggabungkan beberapa. Saya menulis jawaban yang lebih panjang dalam pertanyaan yang sama di sini , dan setelah sekarang menemukan pertanyaan ini saya pikir saya akan terhubung ke itua.recycle()
sangat penting di sini untuk membebaskan memoriJawaban Qberticus baik, tetapi satu detail yang berguna tidak ada. Jika Anda menerapkan ini di perpustakaan ganti:
dengan:
Kalau tidak, aplikasi yang menggunakan perpustakaan akan memiliki kesalahan runtime.
sumber
Jawaban di atas mencakup semuanya dengan sangat terperinci, terlepas dari beberapa hal.
Pertama, jika tidak ada gaya, maka
(Context context, AttributeSet attrs)
tanda tangan metode akan digunakan untuk instantiate preferensi. Dalam hal ini gunakan sajacontext.obtainStyledAttributes(attrs, R.styleable.MyCustomView)
untuk mendapatkan TypedArray.Kedua tidak mencakup cara menangani sumber daya plaur (string kuantitas). Ini tidak bisa ditangani dengan menggunakan TypedArray. Berikut ini cuplikan kode dari SeekBarPreference saya yang menetapkan ringkasan preferensi yang memformat nilainya sesuai dengan nilai preferensi. Jika xml untuk preferensi menyetel android: ringkasan ke string teks atau string, resouce nilai preferensi diformat ke dalam string (seharusnya memiliki% d di dalamnya, untuk mengambil nilai). Jika android: ringkasan diatur ke sumber daya plaur, maka itu digunakan untuk memformat hasilnya.
notifyChanged()
metode preferensionDialogClosed
.sumber
Pendekatan tradisional penuh dengan kode boilerplate dan penanganan sumber daya yang canggung. Itu sebabnya saya membuat kerangka kerja Spyglass . Untuk mendemonstrasikan cara kerjanya, berikut adalah contoh yang menunjukkan cara membuat tampilan kustom yang menampilkan judul String.
Langkah 1: Buat kelas tampilan kustom.
Langkah 2: Tentukan atribut string dalam
values/attrs.xml
file sumber daya:Langkah 3: Terapkan
@StringHandler
anotasi kesetTitle
metode untuk memberi tahu kerangka kerja Spyglass untuk merutekan nilai atribut ke metode ini saat tampilan meningkat.Sekarang kelas Anda memiliki anotasi Spyglass, kerangka kerja Spyglass akan mendeteksinya pada waktu kompilasi dan secara otomatis menghasilkan
CustomView_SpyglassCompanion
kelas.Langkah 4: Gunakan kelas yang dihasilkan dalam metode tampilan kustom
init
:Itu dia. Sekarang ketika Anda instantiate kelas dari XML, pendamping Spyglass menafsirkan atribut dan membuat panggilan metode yang diperlukan. Misalnya, jika kita mengembang tata letak berikut maka
setTitle
akan dipanggil dengan"Hello, World!"
sebagai argumen.Kerangka kerja tidak terbatas pada sumber daya string memiliki banyak anotasi yang berbeda untuk menangani jenis sumber daya lainnya. Ini juga memiliki anotasi untuk menentukan nilai default dan untuk meneruskan nilai placeholder jika metode Anda memiliki beberapa parameter.
Lihat repo Github untuk informasi dan contoh lebih lanjut.
sumber
android:title="@{"Hello, world!"}"
.jika Anda menghilangkan
format
atribut dariattr
elemen, Anda bisa menggunakannya untuk referensi kelas dari tata letak XML.Refactor > Rename
bekerjaFind Usages
bekerjajangan tentukan
format
atribut di ... / src / main / res / values / attrs.xmlgunakan di beberapa file layout ... / src / main / res / layout / activity__main_menu.xml
parsing kelas dalam kode inisialisasi tampilan Anda ... / src / main / java /.../ MyCustomView.kt
sumber