8

Je suis en train de lire des documents sur la méthode getResourceId(). Il est dit:Méthode getResourceId de TypedArray

Récupère l'identificateur de ressource pour l'attribut à l'index. Notez que la ressource d'attribut est résolue lorsque l'objet global TypedArray est extrait. Par conséquent, cette fonction renvoie l'identificateur de ressource de la valeur de ressource finale trouvée, pas nécessairement la ressource d'origine spécifiée par l'attribut.

Alors

  • le premier paragraphe est clair:

Récupère l'identifiant de ressource pour l'attribut à l'index.

  • le second est clair aussi:

Notez que l'attribut ressource comme résolu lorsque l'ensemble TypedArray objet est récupéré.

  • mais ce qui signifie que le 3 paragraphe?pourquoi il pourrait retournerpas nécessairement l'ID de la ressource d'origine?

En conséquence, cette fonction retourne l'identifiant de ressource de la valeur finale des ressources qui a été trouvé, pas nécessairement la ressource originale qui a été spécifié par l'attribut.

Répondre

1

Ceci est dû au fait que Resource Merging doit se produire avant que le TypedArray ne soit récupéré.

Le système de construction Base-Gradle utilise un nouveau mécanisme de fusion pour les ressources . Dans le système de build précédent, la fusion était effectuée en passant une liste de dossiers de ressources à aapt qui faisait office de superpositions, aux côtés de --auto-add-overlay pour que les nouvelles ressources dans les superpositions soient automatiquement ajoutées (le comportement par défaut est pour les superpositions est à seulement remplacer les ressources existantes, pas créer de nouvelles). L'un des objectifs du système de compilation basé sur Gradle était de fournir davantage de flexibilité, et une demande de fonctionnalité fréquemment demandée était la capacité d'avoir plus d'un dossier de ressources. aapt n'est pas en mesure de gérer de sorte que le nouveau système de génération introduit un nouveau mécanisme de fusion qui est exécuté en avance sur aapt et génère un seul dossier de ressources fusionné qui est fourni à aapt.Cette fusion a l'avantage d'être incrémentale, à la fois via la détection de changement d'entrée/sortie de Gradle, et dans la façon dont elle est implémentée (ie elle peut réexécuter la fusion par en appliquant la modification dans un seul fichier).

Les ressources fusionnées viennent de 3 types de sources:

  • Les principales ressources, associées à la principale sourceSet, généralement situé dans src/main/res
  • Les superpositions de variantes, provenant de la construction Type et saveur (s).
  • Les dépendances du projet de bibliothèque, qui contribuent des ressources via l'entrée res dans leur ensemble aar.

Par ex Si vous utilisez différents productFlavors ou buildTypes vous pouvez avoir des ressources différentes pour chaque saveur. Ainsi, celui initialement défini au moment du développement peut être différent de ce qui est réellement présenté après avoir changé la saveur.

+0

mais il me semble un problème d'exécution, pas de temps de construction – GPack

4

De l' documentation:

TypedArray obtainStyledAttributes (AttributeSet set, 
       int[] attrs, 
       int defStyleAttr, 
       int defStyleRes) 

....

Lors de la détermination de la valeur finale d'un attribut particulier, il y a quatre entrées qui entrent en jeu:

  1. Toutes les valeurs d'attribut dans l'AttributeSet donné.
  2. Ressource de style spécifiée dans AttributeSet (nommé "style").
  3. Le style par défaut spécifié par defStyleAttr et defStyleRes
  4. Les valeurs de base de ce thème.