Se sei dell'umore forense, ecco come scavare e scoprire cosa sta succedendo.
android:background="?android:attr/activatedBackgroundIndicator"?
Intuitivamente questo significa impostare lo sfondo su un disegno disegnabile.
Ma scomponiamolo ulteriormente per vedere come arriviamo al nostro misterioso disegnabile.
Per essere precisi significa "impostare l'attributo background a quello a cui si riferisce l'attributo" attivatoBackgroundIndicator " nel tema corrente .
Se capisci la parte "si riferisce al tema attuale", hai praticamente capito tutto ciò che sta succedendo dietro le copertine.
Fondamentalmente, enabledBackgroundIndicator non è un oggetto disegnabile ma un riferimento a un oggetto disegnabile . Allora, dove è effettivamente definito l'attributo "enableBackgroundIndictor"?
È definito nella directory sdk in un nome file attrs.xml . Per esempio:
path_to_android_sdk / piattaforme / android-17 / data / res / values / attrs.xml
Se apri quel file, otterrai la seguente dichiarazione:
<attr name="activatedBackgroundIndicator" format="reference" />
attrs.xml è dove dichiari tutti gli attributi che utilizzerai in seguito nella tua vista xml. Nota che stiamo dichiarando l'attributo e il suo tipo e non stiamo effettivamente assegnando un valore qui .
Il valore effettivo viene assegnato in temi.xml . Questo file si trova in:
path_to_android_sdk / piattaforme / android-17 / data / res / values / themes.xml
Se apri quel file, vedrai le definizioni multiple a seconda del tema che stai utilizzando . Ad esempio, ecco le definizioni per temi denominati rispettivamente Theme, Theme.Light, Theme.Holo, Theme.Holo.Light:
<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>
Ora abbiamo i nostri misteriosi drawables. Se scegli il primo, è definito nella cartella disegnabile in:
path_to_android_sdk / piattaforme / android-17 / data / res / drawable / enabled_background.xml
Se apri quel file vedrai la definizione del disegnabile che è importante per capire cosa sta succedendo.
<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>
Qui stiamo definendo un disegnabile con due stati: lo stato predefinito è solo uno sfondo trasparente e se lo stato è "state_activated", il nostro disegnabile è "list_selector_background_selected".
vedere questo collegamento per informazioni di base su drawables e stati.
"list_selector_background_selected" è un file png con 9 patch che si trova nella cartella drawable-hdpi.
Ora puoi vedere perché abbiamo definito ActivatedBackgroundIndicator come riferimento anziché collegarlo direttamente al file disegnabile: ti consente di scegliere il disegnabile giusto a seconda del tema.