Comment fonctionne «? Android: attr / enabledBackgroundIndicator»?

86

Je cherchais comment mettre en évidence un élément sélectionné dans une liste lors de l'affichage d'une barre d'action contextuelle pour la sélection, et la solution que j'ai trouvée était de définir l' android:backgroundattribut de ma disposition de ligne xml sur "?android:attr/activatedBackgroundIndicator".

Mais comment cela fonctionne-t-il?

  1. quel est le mécanisme impliqué?
  2. que signifient les éléments de syntaxe comme "?", "attr", "enabledBackgroundIndicator"?
  3. où est définie la signification de "enabledBackgroundIndicator"?
jrharshath
la source

Réponses:

221

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.

Numan Salati
la source
3
Une réponse pour les gouverner tous. Donc, fondamentalement, si l'on devait créer un XML avec les mêmes sélecteurs, il pourrait créer son propre "enabledBackgroundIndicator"?
Gee.E
1
exactement - vous pouvez le redéfinir dans votre thème personnalisé.xml b / c c'est un attribut de référence.
numan salati
Cette réponse m'a aidé à comprendre comment définir un dessin personnalisé sur mon élément de liste de tiroir de navigation.
Tastybrownies
C'est une excellente ressource pour commencer à travailler sur un selectortravail 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.
Maurizio
1
Pouvez-vous donner un exemple de la façon de remplacer cet indicateur d'arrière-plan? Le mien ne fonctionne pas: / <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> <item name = "android: enabledBackgroundIndicator"> @ drawable / enabled_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

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.
  • La syntaxe est dans le style

    Doit être une référence à une autre ressource, sous la forme "@ [+] [package:] type: nom" ou à un attribut de thème sous la forme "? [Package:] [type:] nom"

Dans ce cas, le ?signifie regarder un thème dans le package androidet il est du type attroù se trouve le nom activatedBackgroundIndicator.

Vous devriez également pouvoir y accéder dans le code-behind avec android.R.attr.activatedBackgroundIndicator.

Une liste des attrpropriétés Android peut être trouvée sur R.attr

  • activatedBackgroundIndicator est un dessinable défini dans Android 3.0+ comme

    Dessiné utilisé comme arrière-plan pour les éléments activés.

Il 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

Église
la source
5

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:

  1. Créez votre propre thème (qui est juste un nom sophistiqué pour une ressource "style"), dérivant le plus souvent de l'un des thèmes par défaut.
  2. Fournissez votre propre valeur pour l'attribut en question.

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

andr
la source
2

Mise à jour: il existe une version plus détaillée disponible dans le guide de l'API, j'aimerais donc la citer.

Une ressource d'attribut de style vous permet de référencer la valeur d'un attribut dans le thème actuellement appliqué. Le référencement d'un attribut de style vous permet de personnaliser l'apparence des éléments de l'interface utilisateur en les stylisant pour qu'ils correspondent aux variations standard fournies par le thème actuel, au lieu de fournir une valeur codée en dur. Le fait de référencer un attribut de style indique essentiellement: «utilisez le style défini par cet attribut, dans le thème actuel».

Pour référencer un attribut de style, la syntaxe du nom est presque identique au format de ressource normal, mais au lieu du symbole at (@), utilisez un point d'interrogation (?) Et la partie du type de ressource est facultative. Par exemple: `

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

Pour référencer un attribut de style, la syntaxe du nom est presque identique au format de ressource normal, mais au lieu du symbole at (@), utilisez un point d'interrogation (?) Et la partie du type de ressource est facultative. Par exemple:

? [<nom_package>:] [<type_ressource> /] <nom_ressource>

Teng-pao Yu
la source