Si vous êtes d'humeur médico-légale, voici comment creuser et découvrir ce qui se passe.
android:background="?android:attr/activatedBackgroundIndicator"?
Intuitivement, cela signifie définir l'arrière-plan sur certains dessinables.
Mais décomposons cela davantage pour voir comment nous arrivons à notre mystérieux dessinable.
Pour être précis, cela signifie "définir l'attribut background sur ce à quoi l'attribut" enabledBackgroundIndicator " fait référence dans le thème courant .
Si vous comprenez la partie «fait référence dans le thème actuel», vous avez essentiellement compris tout ce qui se passe derrière les couvertures.
Fondamentalement, enabledBackgroundIndicator n'est pas un dessinable réel mais une référence à un dessinable . Alors, où l'attribut "activateBackgroundIndictor" est-il réellement défini?
Il est défini dans votre répertoire sdk dans un nom de fichier attrs.xml . Par exemple:
path_to_android_sdk / plates-formes / android-17 / data / res / values / attrs.xml
Si vous ouvrez ce fichier, vous ferez la déclaration comme suit:
<attr name="activatedBackgroundIndicator" format="reference" />
attrs.xml est l'endroit où vous déclarez tous les attributs que vous allez utiliser plus tard dans votre vue xml. Notez que nous déclarons l'attribut et son type et n'affectons pas réellement de valeur ici .
La valeur réelle est attribuée dans themes.xml . Ce fichier se trouve à:
path_to_android_sdk / plates-formes / android-17 / data / res / values / themes.xml
Si vous ouvrez ce fichier, vous verrez les multiples définitions en fonction du thème que vous utilisez . Par exemple, voici les définitions des noms de thèmes Theme, Theme.Light, Theme.Holo, Theme.Holo.Light respectivement:
<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>
Maintenant, nous avons nos mystérieux drawables. Si vous choisissez le premier, il est défini dans le dossier dessinable à:
path_to_android_sdk / plates-formes / android-17 / data / res / drawable / enabled_background.xml
Si vous ouvrez ce fichier, vous verrez la définition du dessinable, ce qui est important pour comprendre ce qui se passe.
<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>
Ici, nous définissons un dessinable avec deux états - l'état par défaut est juste un arrière-plan transparent et si l'état est "state_activated" alors notre dessinable est "list_selector_background_selected".
voir ce lien pour des informations générales sur les drawables et les états.
"list_selector_background_selected" est un fichier png de 9 patchs qui se trouve dans le dossier drawable-hdpi.
Vous pouvez maintenant voir pourquoi nous avons défini enabledBackgroundIndicator comme référence plutôt que de créer un lien direct vers le fichier dessinable - cela vous permet de choisir le bon dessinable en fonction de votre thème.
selector
travail personnalisé à l' aide de dessinables. Après avoir lu ceci, j'ai utilisé des documents sur les attributs de style pour remplir les pièces restantes.Je me suis également posé la question à un moment donné. Une grande partie des ressources Android semble être comme une boîte noire et ne peut pas les voir directement. Je les manque peut-être quelque part, mais je ne les trouve pas dans le code source du SDK. Voici ce que je sais.
android:background
prendra un tirable.Dans ce cas, le
?
signifie regarder un thème dans le packageandroid
et il est du typeattr
où se trouve le nomactivatedBackgroundIndicator
.Vous devriez également pouvoir y accéder dans le code-behind avec
android.R.attr.activatedBackgroundIndicator
.Une liste des
attr
propriétés Android peut être trouvée sur R.attractivatedBackgroundIndicator
est un dessinable défini dans Android 3.0+ commeIl s'agit essentiellement d'un élément standard défini dans le système d'exploitation. Je n'arrive pas à trouver dans la source Android, mais voici un lien vers la documentation. enabledBackgroundIndicator
la source
Il s'agit d'une forme d'attachement d'une valeur à un thème. La valeur n'est techniquement pas connue lors de la compilation des ressources car les valeurs du thème peuvent ne pas être connues à ce stade. Au lieu de cela, la valeur est résolue au moment de l'exécution en fonction du thème réel extrait (le plus souvent)
ContextThemeWrapper
.Cela permet de réutiliser les valeurs des ressources. Je ne parle pas ici de performances, mais plutôt d'organisation et de maintenance. L'attribut agit comme une variable avec la promesse qu'il contiendra une valeur réelle au moment de l'exécution.
Cette approche permet également une plus grande personnalisation - au lieu de coder en dur la valeur, par exemple, de l'arrière-plan de la fenêtre, il obtient le dessin réel à partir d'un thème, en fournissant un attribut choisi comme clé. Cela vous permet de remplacer la valeur de cet attribut. Vous devez simplement:
La plateforme utilisera automatiquement votre valeur à condition que vous ayez spécifié votre thème pour une activité ou une application. Vous faites cela comme décrit dans la question. La syntaxe générale des références d'attribut de thème est décrite ici: Référencement d'attributs de style . Vous y trouverez également un exemple et une description de l'ensemble du mécanisme.
Éditer
Une chose à noter est les noms d'attributs réels et leur existence dans différentes versions de plate-forme. Il est assez courant que de nouveaux attributs soient introduits dans les prochaines versions de la plate-forme - par exemple, certains ont été ajoutés dans la version 3.0 à des fins de style ActionBar.
Vous devez traiter les noms d'attributs comme faisant partie de l'API - en d'autres termes, ils font partie du contrat que vous êtes autorisé à utiliser. Ceci est très similaire aux classes et à leurs signatures - vous utilisez la
LocationManager
classe dans le but d'obtenir le dernier emplacement de l'appareil car vous savez à partir de certaines sources (tutoriels, références, guides officiels, etc.) quel est le but de cette classe. De même, les noms d'attributs et leur objectif sont (parfois bien, parfois misérablement) définis dans la documentation de la plate-forme Android.la source
Mise à jour: il existe une version plus détaillée disponible dans le guide de l'API, j'aimerais donc la citer.
Réponse originale:
numan salati a déjà offert une réponse parfaite mais il n'a pas répondu au "?" syntaxe. Voici une citation du guide API Accessing Resources
la source