Bagaimana cara kerja “? Android: attr / activatedBackgroundIndicator”?

86

Saya sedang mencari cara menyorot item yang dipilih dalam daftar saat menampilkan bilah tindakan kontekstual untuk pemilihan, dan solusi yang saya temukan adalah menyetel android:backgroundatribut layout baris xml saya ke "?android:attr/activatedBackgroundIndicator".

Bagaimana cara kerja pengaturan ini?

  1. apa mekanisme yang terlibat?
  2. apa arti dari elemen sintaks seperti "?", "attr", "activatedBackgroundIndicator"?
  3. dimana arti dari "activatedBackgroundIndicator" didefinisikan?
jrharshath
sumber

Jawaban:

221

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.

numan salati
sumber
3
Satu jawaban untuk mengatur semuanya. Jadi pada dasarnya jika seseorang membuat XML dengan penyeleksi yang sama, dia bisa membuat "ActivatedBackgroundIndicator" sendiri?
Gee.E
1
persis - Anda dapat mendefinisikannya kembali di theme.xml khusus Anda. b / c itu adalah atribut referensi.
numan salati
Jawaban ini membantu saya mengetahui cara menyetel drawable khusus pada item daftar laci navigasi saya.
Tastybrownies
Ini adalah resource yang bagus untuk mulai mengerjakan pekerjaan kustom selectormenggunakan drawable. Setelah membaca ini saya menggunakan Style Attribute Docs untuk mengisi bagian yang tersisa.
Maurizio
1
Dapatkah Anda memberikan contoh cara mengganti indikator latar belakang ini? Milik saya tidak berfungsi: / <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> <item name = "android: activatedBackgroundIndicator"> @ drawable / activated_background </item> </style> activated_background.xml : <selector xmlns: android = " schemas.android.com/apk/res/android "> <item android: state_activated = "true" android: drawable = "@ color / yellow" /> <item android: drawable = "@ android: color / transparent "/> </selector>
vandus
13

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.
  • Sintaksnya ada dalam gaya

    Harus menjadi referensi ke sumber daya lain, dalam bentuk "@ [+] [paket:] type: name" atau ke atribut tema dalam bentuk "? [Package:] [type:] name"

Dalam hal ini ?menandakan untuk melihat tema dalam paket androiddan itu adalah tipe di attrmana namanya activatedBackgroundIndicator.

Anda seharusnya dapat mengakses ini di belakang kode dengan android.R.attr.activatedBackgroundIndicatorjuga.

Daftar attrproperti Android dapat ditemukan di R.attr

  • activatedBackgroundIndicator adalah drawable yang ditentukan di Android 3.0+ sebagai

    Dapat digambar digunakan sebagai latar belakang untuk item yang diaktifkan.

Ini pada dasarnya hanya item standar yang ditentukan di OS. Sepertinya saya tidak bisa menemukannya di sumber Android, tetapi ini adalah tautan ke dokumentasinya. ActivatedBackgroundIndicator

Gereja
sumber
5

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:

  1. Buat tema Anda sendiri (yang hanya merupakan nama mewah untuk sumber daya "gaya"), paling sering berasal dari salah satu tema default.
  2. Berikan nilai Anda sendiri untuk atribut yang dimaksud.

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 LocationManagerkelas 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.

andr
sumber
2

Pembaruan: Ada versi yang lebih rinci yang tersedia dari Panduan API jadi saya ingin mengutipnya.

Sumber daya atribut gaya memungkinkan Anda mereferensikan nilai atribut dalam tema yang saat ini diterapkan. Mereferensikan atribut gaya memungkinkan Anda menyesuaikan tampilan elemen UI dengan menatanya agar sesuai dengan variasi standar yang disediakan oleh tema saat ini, alih-alih memberikan nilai hard-code. Mereferensikan atribut gaya pada dasarnya mengatakan, "gunakan gaya yang ditentukan oleh atribut ini, dalam tema saat ini."

Untuk mereferensikan atribut gaya, sintaks nama hampir identik dengan format sumber daya normal, tetapi alih-alih simbol-at (@), gunakan tanda tanya (?), Dan bagian jenis sumber daya bersifat opsional. Misalnya: `

Jawaban Asli:

numan salati sudah memberikan jawaban yang sempurna tapi belum menjawab "?" sintaksis. Berikut kutipan dari Panduan Mengakses Sumber Daya API

Untuk mereferensikan atribut gaya, sintaks nama hampir identik dengan format sumber daya normal, tetapi alih-alih simbol-at (@), gunakan tanda tanya (?), Dan bagian jenis sumber daya bersifat opsional. Misalnya:

? [<package_name>:] [<resource_type> /] <resource_name>

Teng-pao Yu
sumber