8

Sto leggendo i documenti sul metodo getResourceId(). Si dice che:metodo GetResourceId di TypedArray

Recupera l'identificatore di risorsa per l'attributo all'indice. Nota che attribuisce la risorsa come risolta quando viene recuperato l'oggetto TypedArray generale . Di conseguenza, questa funzione restituirà l'identificativo della risorsa del valore della risorsa finale trovato, non necessariamente , la risorsa originale specificata dall'attributo.

Così

  • il primo comma è chiaro:

Recupera l'identificatore di risorsa per l'attributo di indice.

  • la seconda è chiaro troppo:

Si noti che l'attributo di risorsa, come risolta quando l'oggetto complessiva TypedArray viene recuperato.

  • ma che cosa significa la 3, paragrafo?perché potrebbe restituirenon necessariamente l'id originale della risorsa?

Come risultato, questa funzione restituisce l'identificatore di risorsa del valore finale risorsa che è stato trovato, non necessariamente la risorsa originale specificato dall'attributo.

risposta

1

Questo è dovuto al fatto che Resource Merging deve essere eseguito prima che lo TypedArray venga recuperato.

Il sistema di generazione Gradle-base utilizza un nuovo meccanismo di fusione per le risorse . Nel precedente sistema di compilazione, l'unione veniva fatta passando a un elenco di cartelle di risorse su aapt che fungeva da sovrapposizioni, insieme a --auto-add-overlay per garantire che le nuove risorse negli overlay vengano automaticamente aggiunte (il comportamento predefinito è per gli overlay è ignorare solo le risorse esistenti, non crearne di nuove).

Uno degli obiettivi del sistema di build basato su Gradle stava fornendo più flessibilità e una richiesta di funzionalità richiesta frequentemente era l'abilità di avere più di una cartella di risorse. aapt non è in grado di gestire così il nuovo sistema di generazione introduce un nuovo meccanismo di fusione che viene eseguito prima di aapt e genera una singola cartella, unita, risorse che viene alimentata a aapt.Questa unione ha il vantaggio di essere incrementale di , sia attraverso il rilevamento delle modifiche di input/output di Gradle, sia di nel modo in cui viene implementata (ovvero può eseguire nuovamente l'unione solo con applicando la modifica in un singolo file).

Le risorse unite sono provenienti da 3 tipi di fonti:

  • Le principali risorse, associata alla sourceSet principale, in genere si trova nella src/main/res
  • Le sovrapposizioni variante, proveniente dal Corporatura Tipo e sapore/i.
  • Le dipendenze del progetto di libreria, che forniscono risorse tramite la voce res nel loro pacchetto aar.

Ad es Se si utilizza diverso productFlavors o buildTypes, si possono avere risorse diverse per ciascun gusto. Quindi, quello originariamente impostato al momento dello sviluppo potrebbe essere diverso da quello che viene effettivamente presentato dopo aver cambiato il sapore.

+0

ma mi sembra un problema di runtime, non buildtime – GPack

4

Dal documentation:

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

....

Nel determinare il valore finale di un attributo particolare, ci sono quattro ingressi che entrano in gioco:

  1. Qualsiasi valore di attributo nel AttributeSet specificato.
  2. La risorsa di stile specificata in AttributeSet (denominato "stile").
  3. Lo stile predefinito specificato da defStyleAttr e defStyleRes
  4. I valori di base in questo tema.