Jika Anda sedang dalam mood forensik, berikut adalah cara menggali dan mencari tahu apa yang sedang terjadi.
android:background="?android:attr/activatedBackgroundIndicator"?
Secara intuitif ini berarti mengatur latar belakang ke beberapa drawable.
Tapi mari kita uraikan ini lebih jauh untuk melihat bagaimana kita sampai ke drawable misterius kita.
Tepatnya, ini berarti "setel atribut latar belakang ke apa yang dirujuk atribut" activatedBackgroundIndicator " dalam tema saat ini .
Jika Anda memahami bagian "mengacu pada tema saat ini", pada dasarnya Anda telah memahami segala sesuatu yang terjadi di balik sampul.
Pada dasarnya, activatedBackgroundIndicator bukanlah drawable sebenarnya, melainkan referensi ke drawable . Jadi, di mana sebenarnya atribut "activationBackgroundIndictor" didefinisikan?
Ini ditentukan dalam direktori sdk Anda dalam nama file attrs.xml . Sebagai contoh:
path_to_android_sdk / platforms / android-17 / data / res / values / attrs.xml
Jika Anda membuka file itu, Anda akan menerima deklarasi sebagai berikut:
<attr name="activatedBackgroundIndicator" format="reference" />
attrs.xml adalah tempat Anda mendeklarasikan semua atribut yang nantinya akan digunakan dalam tampilan xml Anda. Perhatikan bahwa kami mendeklarasikan atribut dan tipenya dan tidak benar-benar memberikan nilai di sini .
Nilai sebenarnya diberikan di themes.xml . File ini terletak di:
path_to_android_sdk / platforms / android-17 / data / res / values / themes.xml
Jika Anda membuka file itu, Anda akan melihat beberapa definisi tergantung pada tema yang Anda gunakan . Misalnya, berikut adalah definisi untuk nama tema Theme, Theme.Light, Theme.Holo, Theme.Holo.Light masing-masing:
<item name="activatedBackgroundIndicator">@android:drawable/activated_background</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_light</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_dark</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_light</item>
Sekarang kami memiliki drawable yang misterius. Jika Anda memilih yang pertama, ini ditentukan dalam folder drawable di:
path_to_android_sdk / platforms / android-17 / data / res / drawable / activated_background.xml
Jika Anda membuka file itu, Anda akan melihat definisi drawable yang penting untuk memahami apa yang sedang terjadi.
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true" android:drawable="@android:drawable/list_selector_background_selected" />
<item android:drawable="@color/transparent" />
</selector>
Di sini kita mendefinisikan drawable dengan dua status - status default hanyalah latar belakang transparan dan jika statusnya adalah "state_activated" maka drawable kami adalah "list_selector_background_selected".
lihat link ini untuk informasi latar belakang tentang drawable dan status.
"list_selector_background_selected" adalah file png 9 patch yang terletak di folder drawable-hdpi.
Sekarang Anda dapat melihat mengapa kami mendefinisikan activationBackgroundIndicator sebagai referensi daripada menautkan langsung ke file drawable - ini memungkinkan Anda memilih drawable yang tepat bergantung pada tema Anda.
selector
menggunakan drawable. Setelah membaca ini saya menggunakan Style Attribute Docs untuk mengisi bagian yang tersisa.Saya juga bertanya-tanya tentang ini pada satu titik. Sejumlah besar sumber daya Android tampak seperti kotak hitam dan tidak dapat melihatnya secara langsung. Saya mungkin merindukannya di suatu tempat, tetapi saya tidak dapat menemukannya di kode sumber SDK. Inilah yang saya tahu.
android:background
akan mengambil drawable.Dalam hal ini
?
menandakan untuk melihat tema dalam paketandroid
dan itu adalah tipe diattr
mana namanyaactivatedBackgroundIndicator
.Anda seharusnya dapat mengakses ini di belakang kode dengan
android.R.attr.activatedBackgroundIndicator
juga.Daftar
attr
properti Android dapat ditemukan di R.attractivatedBackgroundIndicator
adalah drawable yang ditentukan di Android 3.0+ sebagaiIni pada dasarnya hanya item standar yang ditentukan di OS. Sepertinya saya tidak bisa menemukannya di sumber Android, tetapi ini adalah tautan ke dokumentasinya. ActivatedBackgroundIndicator
sumber
Ini adalah bentuk melampirkan nilai dari sebuah tema. Nilai secara teknis tidak diketahui selama kompilasi resource karena nilai tema mungkin tidak diketahui pada saat itu. Sebaliknya, nilai diselesaikan pada waktu proses berdasarkan tema sebenarnya yang diambil dari (paling umum)
ContextThemeWrapper
.Ini menyediakan cara untuk menggunakan kembali nilai sumber daya. Saya tidak berbicara tentang kinerja-bijaksana di sini, melainkan bijaksana organisasi dan pemeliharaan. Atribut bertindak seolah-olah merupakan variabel dengan janji akan menyimpan nilai aktual pada waktu proses.
Pendekatan ini juga memungkinkan untuk kustomisasi yang lebih besar - alih-alih melakukan hardcoding, misalnya, drawable latar belakang jendela, ia mendapatkan drawable aktual dari sebuah tema, menyediakan atribut yang dipilih sebagai kuncinya. Ini memungkinkan Anda mengganti nilai untuk atribut itu. Anda hanya perlu:
Platform akan secara otomatis menggunakan nilai Anda asalkan Anda telah menentukan tema Anda untuk suatu aktivitas atau aplikasi. Anda melakukan ini seperti yang dijelaskan dalam pertanyaan. Sintaks umum dari referensi atribut-tema dijelaskan di sini: Merujuk atribut gaya . Anda juga akan menemukan contoh dan deskripsi dari keseluruhan mekanisme di sana.
Sunting
Satu hal yang harus diperhatikan adalah nama atribut sebenarnya dan keberadaannya di berbagai versi platform. Ini cukup umum untuk atribut baru yang akan diperkenalkan di versi platform berikutnya - misalnya beberapa ditambahkan di versi 3.0 untuk tujuan penataan ActionBar.
Anda harus memperlakukan nama atribut sebagai bagian dari API - dengan kata lain, itu adalah bagian dari kontrak yang boleh Anda gunakan. Ini sangat mirip dengan kelas dan tanda tangannya - Anda menggunakan
LocationManager
kelas untuk tujuan mendapatkan lokasi perangkat terakhir karena Anda tahu dari beberapa sumber (tutorial, referensi, panduan resmi, dll.) Apa tujuan kelas ini. Demikian pula, nama atribut dan tujuannya (terkadang baik, terkadang menyedihkan) ditentukan dalam dokumentasi Platform Android.sumber
Pembaruan: Ada versi yang lebih rinci yang tersedia dari Panduan API jadi saya ingin mengutipnya.
Jawaban Asli:
numan salati sudah memberikan jawaban yang sempurna tapi belum menjawab "?" sintaksis. Berikut kutipan dari Panduan Mengakses Sumber Daya API
sumber