86 votes

Comment "?android:attr/activatedBackgroundIndicator"?

Je cherchais comment faire pour mettre en surbrillance un élément sélectionné dans une liste lors de l'affichage contextuel de la barre d'action pour la sélection, et la solution que j'ai trouvé a été de définir l' android:background attribut de ma ligne de mise en page xml pour "?android:attr/activatedBackgroundIndicator".

Comment ne la définition de ce travail?

  1. qu'est-ce que le mécanisme impliqué?
  2. quelle est la syntaxe des éléments comme des "?", "attr", "activatedBackgroundIndicator"?
  3. où est le sens de "activatedBackgroundIndicator" défini?

221voto

numan salati Points 4684

Si vous êtes dans un forensic ambiance ici est de savoir comment creuser et de trouver ce qui se passe.

android:background="?android:attr/activatedBackgroundIndicator"?

Intuitivement, cela signifie définir l'arrière-plan de certains drawable.

Mais permet de décomposer cet plus loin pour voir comment nous arrivons à notre mystérieux drawable.

Pour être précis, il signifie "définir l'attribut background à ce que l'attribut "activatedBackgroundIndicator" se réfère dans le thème actuel.

Si vous comprenez "désigne dans le thème actuel" partie, vous avez compris tout ce qui se passe derrière les couvertures.

Fondamentalement, activatedBackgroundIndicator est pas un drawable, mais une référence à un drawable. Alors, où est "activateBackgroundIndictor" attribut définit?

Ses définis 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 aurez la déclaration comme suit:

<attr name="activatedBackgroundIndicator" format="reference" />

attrs.xml est l'endroit où vous déclarer tous les attributs que vous êtes va utiliser dans votre affichage xml. Remarque nous déclarer l'attribut et de son type et n'est pas réellement l'attribution d'une valeur ici.

La valeur réelle est affecté dans themes.xml. Ce fichier se trouve dans:

path_to_android_sdk/plates-formes/android-17/data/res/values/themes.xml

Si vous ouvrez ce fichier, vous allez voir les multiples définitions en fonction du thème que vous utilisez. Par exemple, voici les définitions de thèmes de nom de Thème, le Thème.La Lumière, Thème.Holo, Thème.Holo.La lumière 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 que nous avons notre mystérieux un drawable. Si vous choisissez la première, elle est définie dans le dossier drawable:

path_to_android_sdk/plates-formes/android-17/data/res/drawable/activated_background.xml

Si vous ouvrez ce fichier, vous trouverez la définition de la drawable qui est important de 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 sommes à la définition d'une dessinés avec deux états - l'état par défaut est juste un fond transparent, et si l'état est "state_activated" alors notre drawable est "list_selector_background_selected".

voir ce lien pour plus d'information sur sur un drawable et les états.

"list_selector_background_selected" est un 9 patch fichier png qui se trouve dans le drawable-hdpi dossier.

Maintenant vous pouvez voir pourquoi nous avons défini activatedBackgroundIndicator comme référence plutôt que les reliant directement à la drawable de fichier, il vous permet de choisir le droit dessinés en fonction de votre thème.

13voto

Kirk Points 6489

Je me demandais ce aussi bien à un moment donné. Une grande quantité de l'Android les ressources semblent être comme une boîte noire et ne peut pas voir directement. J'ai peut-être pas quelque part, mais je ne peux pas les trouver dans le kit de développement de code source. Voici ce que je sais.

  • android:background va prendre un drawable.
  • La syntaxe est dans le style

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

Dans ce cas, l' ? signifie que pour regarder un thème dans le paquet android et il est de type attr lorsque le nom est activatedBackgroundIndicator.

Vous devriez être en mesure d'accéder à ce dans le code-behind avec android.R.attr.activatedBackgroundIndicator .

Une liste de Android attr propriétés peuvent être trouvés à R. attr

  • activatedBackgroundIndicator est défini drawable dans Android 3.0+

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

Il est fondamentalement juste un point défini dans le système d'exploitation. Je n'arrive pas à trouver dans la source Android, mais voici un lien vers la documentation. activatedBackgroundIndicator

5voto

andr Points 5822

C'est une forme d'attacher une valeur à partir d'un thème. La valeur n'est techniquement pas connue lors de la compilation des sources, parce que le thème de valeurs ne peuvent pas être connues à ce point. Au lieu de cela, la valeur est réglée au moment de l'exécution, sur la base du thème de la prise d' (le plus souvent) ContextThemeWrapper.

Cela fournit un moyen de réutiliser les valeurs de la ressource. Je ne parle pas de performance, mais plutôt de l'organisation et de l'entretien-sage. L'attribut agit comme il s'agissait d'une variable avec la promesse qu'il tiendra 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 fond de la fenêtre drawable il obtient le réel dessiné à partir d'un thème, de la fourniture d'un attribut choisi comme clé. Cela vous permet de vous remplacer la valeur de l'attribut. Vous avez simplement besoin de:

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

La plateforme permettra d'utiliser automatiquement votre valeur, à condition que vous avez défini votre thème pour une activité ou d'une application. Vous faites cela comme décrit dans la question. La syntaxe générale de thème-attribut de références est décrit ici: Référencement des attributs de style. Vous trouverez également un exemple et une description de l'ensemble du mécanisme.

Modifier

Une chose qui doit être noté est le véritable attribut de noms et de leur existence dans les différentes versions de plate-forme. Il est assez commun pour les nouveaux attributs pour être présenté dans les prochaines versions de plate-forme - par exemple, certains ont été ajoutés dans la version 3.0 pour le but de ActionBar style.

Vous devez traiter les noms d'attribut dans le cadre de l'API - en d'autres termes, ils font partie intégrante du contrat que vous êtes autorisé à utiliser. Ceci est très similaire à des classes et de leurs signatures - vous utiliser LocationManager de la classe dans le but d'obtenir le dernier emplacement de l'appareil, car vous le savez à partir de certaines sources (tutoriels, de référence, de guides officiels, etc.) quel est le but de cette classe. De même, les noms d'attributs et leurs fonctions sont (parfois bien, parfois lamentablement) défini dans la Plate-forme Android de la documentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X