Come funziona "? Android: attr / activationBackgroundIndicator"?


86

Stavo cercando come evidenziare un elemento selezionato in un elenco durante la visualizzazione di una barra delle azioni contestuali per la selezione e la soluzione che ho trovato è stata impostare l' android:backgroundattributo del mio layout di riga xml su "?android:attr/activatedBackgroundIndicator".

Ma come funziona l'impostazione?

  1. qual è il meccanismo coinvolto?
  2. cosa significano gli elementi di sintassi come "?", "attr", "enabledBackgroundIndicator"?
  3. dove è definito il significato di "enabledBackgroundIndicator"?

Risposte:


221

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.


3
Una risposta per dominarli tutti. Quindi, fondamentalmente, se uno dovesse creare un XML con gli stessi selettori, potrebbe creare il suo "enabledBackgroundIndicator"?
Gee.E

1
esattamente - puoi ridefinirlo nel tuo tema personalizzato.xml b / c è un attributo di riferimento.
numan salati

Questa risposta mi ha aiutato a capire come impostare un disegnabile personalizzato sulla mia voce di elenco del drawer di navigazione.
Tastybrownies

Questa è un'ottima risorsa per iniziare a lavorare su un selectorlavoro personalizzato utilizzando i drawable. Dopo aver letto questo, ho usato i documenti sugli attributi di stile per riempire i pezzi rimanenti.
Maurizio

1
Potete fornire un esempio di come ignorare questo indicatore di sfondo? Il mio non funziona: / <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> <item name = "android: activationBackgroundIndicator"> @ drawable / activation_background </item> </style> enabled_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

Mi sono chiesto anche questo a un certo punto. Una grande quantità di risorse Android sembra essere come una scatola nera e non può vederle direttamente. Potrei perderli da qualche parte, ma non riesco a trovarli nel codice sorgente dell'SDK. Ecco quello che so.

  • android:background prenderà un drawable.
  • La sintassi è nello stile

    Deve essere un riferimento a un'altra risorsa, nella forma "@ [+] [pacchetto:] tipo: nome" o a un attributo del tema nella forma "? [Pacchetto:] [tipo:] nome"

In questo caso ?significa guardare un tema nel pacchetto androided è del tipo attrdove si trova il nome activatedBackgroundIndicator.

Dovresti essere in grado di accedervi anche nel code-behind con android.R.attr.activatedBackgroundIndicator.

Un elenco di attrproprietà Android è disponibile su R.attr

  • activatedBackgroundIndicator è un disegnabile definito in Android 3.0+ come

    Drawable utilizzato come sfondo per gli elementi attivati.

È fondamentalmente solo un elemento standard definito nel sistema operativo. Non riesco a trovare nella fonte Android, ma qui c'è un collegamento alla documentazione. attivatoBackgroundIndicator


5

Questa è una forma per allegare un valore da un tema. Il valore non è tecnicamente noto durante la compilazione delle risorse perché i valori del tema potrebbero non essere noti a quel punto. Invece il valore viene risolto in fase di esecuzione in base al tema effettivo tratto da (più comunemente) ContextThemeWrapper.

Ciò fornisce un modo per riutilizzare i valori delle risorse. Non sto parlando in termini di prestazioni qui, ma piuttosto di organizzazione e manutenzione. L'attributo agisce come se fosse una variabile con la promessa che manterrà un valore effettivo in fase di esecuzione.

Questo approccio consente anche una maggiore personalizzazione - invece di codificare il valore, ad esempio, dello sfondo della finestra disegnabile, ottiene l'effettivo disegnabile da un tema, fornendo un attributo scelto come chiave. Ciò consente di sostituire il valore per quell'attributo. Devi semplicemente:

  1. Crea il tuo tema (che è solo un nome di fantasia per una risorsa "stile"), più comunemente derivante da uno dei temi predefiniti.
  2. Fornisci il tuo valore per l'attributo in questione.

La piattaforma utilizzerà automaticamente il tuo valore a condizione che tu abbia specificato il tema per un'attività o un'applicazione. Lo fai come descritto nella domanda. La sintassi generale dei riferimenti agli attributi del tema è descritta qui: Riferimenti agli attributi di stile . Lì troverai anche un esempio e una descrizione dell'intero meccanismo.

modificare

Una cosa da notare sono i nomi degli attributi effettivi e la loro esistenza in varie versioni della piattaforma. È abbastanza comune che nuovi attributi vengano introdotti nelle prossime versioni della piattaforma, ad esempio alcuni sono stati aggiunti nella versione 3.0 ai fini dello stile di ActionBar.

Dovresti trattare i nomi degli attributi come parte dell'API, in altre parole, fanno parte del contratto che sei autorizzato a utilizzare. Questo è molto simile alle classi e alle loro firme: usi la LocationManagerclasse allo scopo di ottenere l'ultima posizione del dispositivo perché sai da qualche fonte (tutorial, riferimenti, guide ufficiali, ecc.) Qual è lo scopo di questa classe. Allo stesso modo, i nomi degli attributi e il loro scopo sono (a volte bene, a volte miseramente) definiti nella documentazione della piattaforma Android.


2

Aggiornamento: è disponibile una versione più dettagliata dalla Guida API, quindi vorrei citarla.

Una risorsa attributo di stile consente di fare riferimento al valore di un attributo nel tema attualmente applicato. Fare riferimento a un attributo di stile consente di personalizzare l'aspetto degli elementi dell'interfaccia utente assegnando loro uno stile in modo che corrispondano alle variazioni standard fornite dal tema corrente, invece di fornire un valore hardcoded. Fare riferimento a un attributo di stile dice essenzialmente "usa lo stile definito da questo attributo, nel tema corrente".

Per fare riferimento a un attributo di stile, la sintassi del nome è quasi identica al normale formato della risorsa, ma invece del simbolo at (@), usa un punto interrogativo (?) E la parte del tipo di risorsa è facoltativa. Ad esempio: `

Risposta originale:

numan salati ha già offerto una risposta perfetta ma non ha affrontato il "?" sintassi. Ecco una citazione dalla Guida API per l' accesso alle risorse

Per fare riferimento a un attributo di stile, la sintassi del nome è quasi identica al normale formato della risorsa, ma invece del simbolo at (@), usa un punto interrogativo (?) E la parte del tipo di risorsa è facoltativa. Per esempio:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.