Le risorse sono i file aggiuntivi e i contenuti statici utilizzati dal codice, ad esempio bitmap, definizioni di layout, stringhe dell'interfaccia utente, istruzioni di animazione e altro ancora.
Estrai sempre le risorse dell'app, come immagini e stringhe, dal codice, in modo da poterle gestire in modo indipendente. Inoltre, fornisci risorse alternative per configurazioni specifiche dei dispositivi raggruppandole in directory delle risorse con nomi speciali. In fase di runtime, Android utilizza la risorsa appropriata in base alla configurazione corrente. Ad esempio, potresti voler fornire un layout dell'interfaccia utente diverso a seconda delle dimensioni dello schermo o stringhe diverse a seconda dell'impostazione della lingua.
Una volta esternalizzate le risorse dell'app, puoi accedervi
utilizzando gli ID risorsa generati nella classe R del progetto.
Questo documento mostra come raggruppare le risorse nel tuo progetto Android. Mostra anche come fornire risorse alternative per configurazioni specifiche del dispositivo e come accedervi dal codice dell'app o da altri file XML.
Tipi di risorse del gruppo
Inserisci ogni tipo di risorsa in una sottodirectory specifica della directory
res/ del progetto. Ad esempio, ecco la gerarchia dei file per un progetto semplice:
MyProject/
src/
MyActivity.java
res/
drawable/
graphic.png
layout/
main.xml
info.xml
mipmap/
icon.png
values/
strings.xml
La directory res/ contiene tutte le risorse nelle relative sottodirectory: una risorsa immagine, due risorse di layout, una directory mipmap/ per le icone di avvio e un file di risorse stringa. I nomi delle directory delle risorse sono importanti e sono descritti nella tabella 1.
Nota:per ulteriori informazioni sull'utilizzo delle cartelle mipmap, consulta Inserire le icone delle app nelle directory mipmap.
Tabella 1. Directory delle risorse
supportate all'interno della directory del progetto res/.
| Directory | Tipo di risorsa |
|---|---|
animator/ |
File XML che definiscono le animazioni della proprietà. |
anim/ |
File XML che definiscono le animazioni
Tween. In questa directory possono essere salvate anche le animazioni delle proprietà, ma
la directory animator/ è preferita per le animazioni delle proprietà per distinguere i due
tipi. |
color/ |
File XML che definiscono un elenco di stati dei colori. Per saperne di più, consulta Risorsa elenco stati colore. |
drawable/ |
File bitmap (PNG,
Per saperne di più, consulta Risorse disegnabili. |
mipmap/ |
File disegnabili per diverse densità delle icone di avvio. Per saperne di più sulla gestione
delle icone del launcher con le cartelle mipmap/, consulta
Inserire le icone delle app nelle
directory mipmap. |
layout/ |
File XML che definiscono il layout di un'interfaccia utente. Per saperne di più, consulta Risorsa di layout. |
menu/ |
File XML che definiscono i menu delle app, ad esempio un menu delle opzioni, un menu contestuale o un sottomenu. Per saperne di più, consulta Risorsa Menu. |
raw/ |
File arbitrari da salvare nel formato non elaborato. Per aprire queste risorse con un Tuttavia, se hai bisogno di accedere ai nomi file e alla gerarchia dei file originali, valuta la possibilità di salvare le risorse nella directory |
values/ |
File XML che contengono valori semplici, come stringhe, numeri interi e colori. Mentre i file di risorse XML in altre sottodirectory Poiché ogni risorsa è definita con il proprio elemento XML, puoi assegnare al file il nome che preferisci e inserire diversi tipi di risorse in un unico file. Tuttavia, per chiarezza, ti consigliamo di inserire tipi di risorse unici in file diversi. Ad esempio, ecco alcune convenzioni per i nomi dei file delle risorse che puoi creare in questa directory:
Per saperne di più, consulta Risorse stringa, Risorsa di stile e Altri tipi di risorse. |
xml/ |
File XML arbitrari che possono essere letti in fase di runtime chiamando Resources.getXML(). Qui devono essere salvati vari file di configurazione XML, ad esempio una configurazione di ricerca.
|
font/ |
File di caratteri con estensioni come TTF, OTF
o TTC o file XML che
includono un elemento <font-family>. Per saperne di più sui caratteri come risorse, consulta Aggiungere un carattere come risorsa XML.
|
Attenzione:non salvare mai i file di risorse direttamente nella directory
res/. Causa un errore del compilatore.
Per saperne di più sui singoli tipi di risorse, consulta la panoramica dei tipi di risorse.
Le risorse che salvi nelle sottodirectory definite nella tabella 1 sono le tue risorse predefinite. ovvero definiscono il design e i contenuti predefiniti per la tua app. Tuttavia, diversi tipi di dispositivi Android potrebbero richiedere diversi tipi di risorse.
Ad esempio, puoi fornire risorse di layout diverse per i dispositivi con schermi più grandi del normale per sfruttare lo spazio aggiuntivo. Puoi anche fornire risorse stringa diverse che traducono il testo nell'interfaccia utente in base all'impostazione della lingua del dispositivo. Per fornire queste risorse diverse per configurazioni di dispositivi diverse, devi fornire risorse alternative oltre a quelle predefinite.
Fornire risorse alternative
La maggior parte delle app fornisce risorse alternative per supportare configurazioni specifiche del dispositivo. Ad esempio, includi risorse disegnabili alternative per densità dello schermo diverse e risorse stringa alternative per lingue diverse. In fase di runtime, Android rileva la configurazione attuale del dispositivo e carica le risorse appropriate per la tua app.
Figura 1. Due dispositivi che utilizzano risorse di layout diverse in base alle dimensioni dello schermo.
Per specificare alternative specifiche per la configurazione per un insieme di risorse:
- Crea una nuova directory in
res/denominata nel modulo<resources_name>-<qualifier>.<resources_name>è il nome della directory delle risorse predefinite corrispondenti (definite nella tabella 1).<qualifier>è un nome che specifica una singola configurazione per la quale devono essere utilizzate queste risorse (definita nella tabella 2).
Puoi aggiungere più di un
<qualifier>. Separa ogni valore con un trattino.Attenzione:quando aggiungi più qualificatori, devi inserirli nello stesso ordine in cui sono elencati nella tabella 2. Se i qualificatori sono ordinati in modo errato, le risorse vengono ignorate.
- Salva le risorse alternative appropriate in questa nuova directory. I file di risorse devono avere lo stesso nome dei file di risorse predefiniti.
Ad esempio, ecco alcune risorse predefinite e alternative:
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
Il qualificatore hdpi indica che le risorse nella directory sono destinate a dispositivi con uno schermo ad alta densità. Le immagini in queste directory drawable sono dimensionate per densità dello schermo specifiche, ma i nomi file sono esattamente gli stessi. In questo modo, l'ID risorsa che utilizzi per fare riferimento all'immagine icon.png o
background.png è sempre lo stesso. Android seleziona la versione di ogni risorsa che corrisponde meglio al dispositivo attuale confrontando le informazioni di configurazione del dispositivo con i qualificatori nel nome della directory delle risorse.
Attenzione:quando definisci una risorsa alternativa, assicurati di definire la risorsa anche in una configurazione predefinita. In caso contrario, la tua app potrebbe riscontrare eccezioni di runtime
quando il dispositivo modifica una configurazione. Ad esempio, se aggiungi una stringa solo a
values-en e non a values, la tua app potrebbe riscontrare un'eccezione
Resource Not Found quando l'utente cambia la lingua di sistema predefinita.
La tabella 2 elenca i qualificatori di configurazione validi in ordine di precedenza. Puoi aggiungere più qualificatori a un nome di directory separandoli con un trattino. Se utilizzi più qualificatori per una directory delle risorse, devi aggiungerli al nome della directory nell'ordine in cui sono elencati nella tabella.
Tabella 2. Nomi dei qualificatori di configurazione.
| Configurazione | Valori del qualificatore | Descrizione |
|---|---|---|
| MCC e MNC | Esempi:mcc310mcc208-mnc00
|
Il codice paese mobile (MCC), seguito facoltativamente dal codice di rete mobile (MNC)
della scheda SIM del dispositivo. Ad esempio, Se il dispositivo utilizza una connessione radio (ovvero è un cellulare GSM), i valori MCC e MNC provengono dalla scheda SIM. Puoi anche utilizzare il codice paese da solo, ad esempio per includere risorse legali specifiche per paese nella tua app. Se devi specificare solo in base alla lingua, utilizza invece il qualificatore lingua, sistema di scrittura (facoltativo) e regione (facoltativo). Se utilizzi il qualificatore MCC e MNC, fallo con attenzione e verifica che funzioni come previsto. Vedi anche i campi di configurazione |
| Lingua, script (facoltativo) e regione (facoltativo) | Esempi:enfren-rUSfr-rFRfr-rCAb+enb+en+USb+es+419b+zh+Hantb+sr+Latn+RS |
La lingua è definita da un codice lingua ISO 639-1 di due lettere, facoltativamente seguito
da un codice regione ISO 3166-1-alpha-2 di due lettere (preceduto da
I codici non sono sensibili alle maiuscole. Il prefisso Android 7.0 (livello API 24) ha introdotto il supporto per i tag di lingua BCP 47, che puoi utilizzare per qualificare le risorse specifiche per lingua e regione. Un tag di lingua è composto da una sequenza di uno o più tag secondari, ognuno dei quali perfeziona o restringe l'intervallo di lingue identificate dal tag complessivo. Per saperne di più sui tag di lingua, consulta Tag per l'identificazione delle lingue. Per utilizzare un tag lingua BCP 47, concatena Il tag della lingua può cambiare durante il ciclo di vita dell'app se gli utenti modificano la lingua nelle impostazioni di sistema. Per informazioni su come questo può influire sulla tua app durante l'esecuzione, vedi Gestire le modifiche alla configurazione. Per una guida completa alla localizzazione della tua app per altre lingue, consulta Localizzare l'app. Consulta anche il metodo |
| Genere grammaticale | masculinefeminineneuter |
Il genere grammaticale dell'utente. Utilizzato per le lingue che hanno un genere grammaticale. Ad esempio, se devi fornire risorse diverse per gli utenti di lingua francese, puoi utilizzare directory come le seguenti:
Vedi Flessione grammaticale in Android. Consulta anche il metodo di configurazione Aggiunto nel livello API 34. |
| Direzione del layout | ldrtlldltr |
La direzione del layout dell'app. Può essere applicato a qualsiasi risorsa, ad esempio layout, drawables o valori. Ad esempio, se vuoi fornire un layout specifico per la lingua araba e un layout generico per qualsiasi altra lingua "da destra a sinistra", come il persiano o l'ebraico, utilizza directory come le seguenti:
Nota:per attivare le funzionalità di layout da destra a sinistra
per la tua app, devi impostare Aggiunto nel livello API 17. |
| Larghezza minima | sw<N>dpEsempi: sw320dpsw600dpsw720dpecc. |
La dimensione più piccola dell'area dello schermo disponibile per un'app.
Nello specifico, il
Ad esempio, se il layout richiede che la dimensione più piccola dell'area
dello schermo sia sempre di almeno 600 dp, puoi utilizzare questo qualificatore per
creare le risorse di layout in una directory L'utilizzo della larghezza più piccola per determinare le dimensioni generali dello schermo è utile perché la larghezza è spesso il fattore determinante nella progettazione di un layout. Un'interfaccia utente spesso scorre verticalmente, ma ha vincoli piuttosto rigidi sullo spazio minimo necessario orizzontalmente. La larghezza disponibile è anche il fattore chiave per determinare se utilizzare un layout a un riquadro per i portatili o un layout a più riquadri per i tablet. Pertanto, probabilmente ti interessa di più la larghezza minima possibile su ogni dispositivo. La larghezza più piccola di un dispositivo tiene conto delle decorazioni dello schermo e dell'interfaccia utente del sistema. Ad esempio, se il dispositivo ha elementi UI persistenti sullo schermo che occupano spazio lungo l'asse della larghezza più piccola, il sistema dichiara che la larghezza più piccola è inferiore alle dimensioni effettive dello schermo, perché si tratta di pixel dello schermo non disponibili per la tua UI. Alcuni valori che potresti utilizzare qui per le dimensioni dello schermo comuni:
Quando la tua app fornisce più directory di risorse con valori diversi per il qualificatore Aggiunto nel livello API 13. Consulta anche l'attributo Per saperne di più sulla progettazione per schermi diversi utilizzando questo qualificatore, consulta Progettazione reattiva/adattiva con le visualizzazioni. |
| Larghezza e altezza disponibili | w<N>dph<N>dpEsempi: w720dpw1024dph720dph1024dpecc. |
Specifica la larghezza o l'altezza minima disponibile dello schermo (in unità La larghezza e l'altezza disponibili sono spesso utili per determinare se utilizzare un layout a più riquadri, perché anche su un tablet spesso non vuoi lo stesso layout a più riquadri per l'orientamento verticale e orizzontale. Pertanto, puoi utilizzarli per specificare la larghezza e/o l'altezza minima richieste per il layout, anziché utilizzare insieme i qualificatori di dimensioni e orientamento dello schermo. Quando la tua app fornisce più directory di risorse con valori diversi per queste configurazioni, il sistema utilizza quella più vicina (senza superarla) alla larghezza dello schermo attuale del dispositivo. Più vicino a viene determinato sommando le differenze tra la larghezza effettiva dello schermo e la larghezza specificata alla differenza tra l'altezza effettiva dello schermo e l'altezza specificata, con altezze e larghezze non specificate con un valore pari a 0. I valori escludono l'area occupata dagli
inset della finestra, quindi se il dispositivo ha
elementi UI persistenti sui bordi del display, i valori di larghezza e altezza sono
inferiori alle dimensioni reali dello schermo, anche quando l'app viene visualizzata da bordo a bordo
utilizzando
Alcune decorazioni dello schermo verticale non fisse (ad esempio una barra di stato dello smartphone che può essere nascosta a schermo intero) non vengono prese in considerazione qui, così come le decorazioni della finestra, come la barra del titolo o la barra delle azioni, pertanto le app devono essere preparate a gestire uno spazio leggermente più piccolo di quello specificato. Nota:il sistema sceglie la risorsa che corrisponde sia in larghezza che in altezza. Pertanto, una risorsa che specifica entrambi è preferibile a una che ne specifica solo uno. Ad esempio, se lo schermo effettivo ha una larghezza di 720 dp e un'altezza di 1280 dp e una risorsa è qualificata con w720dp e un'altra è qualificata come w700dp-h1200dp, viene scelta quest'ultima anche se la prima corrisponde esattamente a ciò che specifica. Aggiunto nel livello API 13. Vedi anche i campi di configurazione Per saperne di più sulla progettazione per schermi diversi utilizzando questo qualificatore, consulta Progettazione reattiva/adattiva con le visualizzazioni. |
| Dimensioni schermo |
smallnormallargexlarge
|
Nota:l'utilizzo di un qualificatore di dimensioni non implica che le risorse siano solo per schermi di quelle dimensioni. Se non fornisci risorse alternative con qualificatori che corrispondono meglio alla configurazione attuale del dispositivo, il sistema può utilizzare le risorse che corrispondono meglio. Attenzione:se tutte le risorse utilizzano un qualificatore di dimensione più grande dello schermo attuale, il sistema non le utilizza e l'app si arresta in modo anomalo in fase di runtime. Ciò accade, ad esempio, se tutte le risorse di layout
sono taggate con il qualificatore Aggiunto nel livello API 4. Vedi anche il campo di configurazione Per saperne di più, consulta la Panoramica della compatibilità dello schermo. |
| Aspetto dello schermo |
longnotlong
|
Aggiunto nel livello API 4. Questo valore si basa esclusivamente sulle proporzioni dello schermo (uno schermo Vedi anche il campo di configurazione |
| Schermo rotondo |
roundnotround
|
Aggiunto nel livello API 23. Consulta anche il metodo di configurazione |
| Ampia gamma di colori |
widecgnowidecg
|
Aggiunto nel livello API 26. Vedi anche il metodo di configurazione |
| Tecnologia HDR (High Dynamic Range) |
highdrlowdr
|
Aggiunto nel livello API 26. Consulta anche il metodo di configurazione |
| Orientamento schermo |
portland
|
Questo valore può cambiare durante il ciclo di vita dell'app se l'utente ruota lo schermo. Per informazioni su come influisce sulla tua app durante l'esecuzione, vedi Gestire le modifiche alla configurazione. Vedi anche il campo di configurazione |
| Modalità UI |
cardesktelevisionappliancewatchvrheadset
|
Aggiunto nel livello API 8; televisione aggiunta nell'API 13; orologio aggiunto nell'API 20. Per informazioni su come la tua app può rispondere quando il dispositivo viene inserito o rimosso da una base, leggi Determinare e monitorare lo stato e il tipo di aggancio. Questo valore può cambiare durante il ciclo di vita dell'app se l'utente posiziona il dispositivo in una
base di ricarica. Puoi attivare o disattivare alcune di queste modalità utilizzando
|
| Modalità notturna |
nightnotnight
|
Aggiunto nel livello API 8. Questa impostazione può cambiare durante il ciclo di vita dell'app se la modalità notturna viene lasciata in
modalità automatica (impostazione predefinita), nel qual caso la modalità cambia in base all'ora del giorno. Puoi attivare
o disattivare questa modalità utilizzando |
| Densità di pixel dello schermo (dpi) |
ldpimdpihdpixhdpixxhdpixxxhdpinodpitvdpianydpinnndpi
|
Esiste un rapporto di scalabilità 3:4:6:8:12:16 tra le sei densità principali (ignorando la densità tvdpi). Pertanto, una bitmap 9x9 in ldpi è 12x12 in mdpi, 18x18 in hdpi, 24x24 in xhdpi e così via. Nota:l'utilizzo di un qualificatore di densità non implica che le risorse siano solo per schermi di quella densità. Se non fornisci risorse alternative con qualificatori che corrispondono meglio alla configurazione attuale del dispositivo, il sistema utilizza le risorse che corrispondono meglio. Per ulteriori informazioni su come gestire diverse densità dello schermo e su come Android potrebbe scalare le bitmap per adattarle alla densità corrente, consulta Panoramica della compatibilità dello schermo. |
| Tipo di touchscreen |
notouchfinger
|
Vedi anche il campo di configurazione |
| Disponibilità della tastiera |
keysexposedkeyshiddenkeyssoft
|
Se fornisci risorse Questo valore può cambiare durante il ciclo di vita dell'app se l'utente apre una tastiera hardware. Per informazioni su come influisce sulla tua app durante l'esecuzione, vedi Gestire le modifiche alla configurazione. Vedi anche i campi di configurazione |
| Metodo di immissione del testo principale |
nokeysqwerty12key
|
Vedi anche il campo di configurazione |
| Disponibilità del tasto di navigazione |
navexposednavhidden
|
Questo valore può cambiare durante la vita dell'app se l'utente mostra i tasti di navigazione. Per informazioni su come influisce sulla tua app durante l'esecuzione, vedi Gestire le modifiche alla configurazione. Vedi anche il campo di configurazione |
| Metodo di navigazione principale non touch |
nonavdpadtrackballwheel
|
Vedi anche il campo di configurazione |
| Versione della piattaforma (livello API) | Esempi:v3v4v7ecc. |
Il livello API supportato dal dispositivo. Ad esempio, |
Nota:non tutte le versioni di Android supportano tutti i qualificatori. L'utilizzo di un nuovo qualificatore aggiunge implicitamente
il qualificatore della versione della piattaforma in modo che i dispositivi meno recenti possano ignorarlo. Ad esempio, l'utilizzo
di un qualificatore w600dp include automaticamente il qualificatore v13, perché
il qualificatore larghezza disponibile è stato introdotto nel livello API 13. Per evitare problemi, includi sempre un insieme di risorse predefinite (un insieme di risorse senza qualificatori). Per ulteriori informazioni, consulta la sezione
Fornire la migliore compatibilità dei dispositivi con le
risorse.
Regole per i nomi dei qualificatori
Di seguito sono riportate alcune regole sull'utilizzo dei nomi dei qualificatori di configurazione:
- Puoi specificare più qualificatori per un singolo insieme di risorse, separati da trattini. Ad esempio,
drawable-en-rUS-landsi applica ai dispositivi in inglese statunitense in orientamento orizzontale. - I qualificatori devono essere nell'ordine elencato nella tabella 2.
- Errato:
drawable-hdpi-port/ - Corretto:
drawable-port-hdpi/
- Errato:
- Le directory delle risorse alternative non possono essere nidificate. Ad esempio, non puoi avere
res/drawable/drawable-en/. - I valori non fanno distinzione tra maiuscole e minuscole. Il compilatore di risorse converte i nomi delle directory in minuscolo prima dell'elaborazione per evitare problemi sui file system che non fanno distinzione tra maiuscole e minuscole. Le lettere maiuscole nei nomi servono solo per migliorare la leggibilità.
- È supportato un solo valore per ogni tipo di qualificatore. Ad esempio, se vuoi utilizzare
gli stessi file disegnabili per Spagna e Francia, non puoi avere una directory denominata
drawable-es-fr/. Devi invece avere due directory delle risorse, ad esempiodrawable-es/edrawable-fr/, che contengono i file appropriati. Tuttavia, non è necessario duplicare effettivamente i file in entrambe le posizioni. Puoi invece creare un alias per una risorsa, come descritto nella sezione Creare risorse alias.
Dopo aver salvato le risorse alternative in directory denominate con questi qualificatori, Android applica automaticamente le risorse nella tua app in base alla configurazione attuale del dispositivo. Ogni volta che viene richiesta una risorsa, Android controlla le directory delle risorse alternative che contengono il file di risorse richiesto, quindi trova la risorsa con la corrispondenza migliore.
Se non sono presenti risorse alternative che corrispondono a una particolare configurazione del dispositivo, Android utilizza le risorse predefinite corrispondenti, ovvero l'insieme di risorse per un particolare tipo di risorsa che non include un qualificatore di configurazione.
Creare risorse alias
Quando hai una risorsa che vuoi utilizzare per più di una configurazione del dispositivo, ma non vuoi fornirla come risorsa predefinita, non devi inserirla in più di una directory di risorse alternative. Puoi invece creare una risorsa alternativa che funge da alias per una risorsa salvata nella directory delle risorse predefinita.
Nota:non tutte le risorse offrono un meccanismo per creare un alias per un'altra risorsa. In particolare, le risorse di animazione, menu, raw e altre non specificate
nella directory xml/ non offrono questa funzionalità.
Ad esempio, supponiamo di avere un'icona dell'app, icon.png, e di averne bisogno di una versione unica
per diverse impostazioni internazionali. Tuttavia, due impostazioni internazionali, inglese-canadese e francese-canadese, devono utilizzare la stessa versione. Non è necessario copiare la stessa immagine
nella directory delle risorse sia per l'inglese canadese che per il francese canadese.
Puoi invece salvare l'immagine utilizzata per entrambi con un nome diverso da
icon.png, ad esempio icon_ca.png, e inserirla
nella directory res/drawable/ predefinita. Poi crea un file icon.xml in res/drawable-en-rCA/ e res/drawable-fr-rCA/ che fa riferimento alla risorsa icon_ca.png
utilizzando l'elemento <bitmap>. In questo modo puoi memorizzare una sola versione del
file PNG e due piccoli file XML che rimandano a esso. Per maggiori dettagli, consulta gli esempi nelle sezioni seguenti.
Disegnabile
Per creare un alias per una risorsa disegnabile esistente, utilizza l'elemento <drawable>:
<?xml version="1.0" encoding="utf-8"?> <resources> <drawable name="icon">@drawable/icon_ca</drawable> </resources>
Se salvi questo file come icon.xml in una directory delle risorse alternativa, ad esempio res/values-en-rCA/, viene compilato in una risorsa a cui puoi fare riferimento come R.drawable.icon, ma in realtà è un alias della risorsa R.drawable.icon_ca, che viene salvata in res/drawable/.
Layout
Per creare un alias per un layout esistente, utilizza l'elemento <include>, racchiuso in un <merge>:
<?xml version="1.0" encoding="utf-8"?> <merge> <include layout="@layout/main_ltr"/> </merge>
Se salvi questo file come main.xml, viene compilato in una risorsa a cui puoi fare riferimento
come R.layout.main, ma in realtà è un alias della risorsa R.layout.main_ltr.
Stringhe e altri valori semplici
Per creare un alias per una stringa esistente, utilizza l'ID risorsa della stringa desiderata come valore per la nuova stringa:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello</string> <string name="hi">@string/hello</string> </resources>
La risorsa R.string.hi ora è un alias di R.string.hello.
Altri valori semplici funzionano allo stesso modo, ad esempio i colori:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="red">#f00</color> <color name="highlight">@color/red</color> </resources>
Accedere alle risorse dell'app
Una volta fornita una risorsa nella tua applicazione, puoi applicarla facendo riferimento al relativo ID risorsa. Tutti gli ID risorsa sono definiti nella classe R del progetto, che
lo strumento aapt genera automaticamente.
Quando l'applicazione viene compilata, aapt genera la classe R, che contiene
gli ID risorsa per tutte le risorse nella directory res/. Per ogni tipo di risorsa, esiste una sottoclasse R, ad esempio R.drawable per tutte le risorse disegnabili. Per ogni risorsa di questo tipo, esiste un
numero intero statico, ad esempio R.drawable.icon. Questo numero intero è l'ID risorsa che puoi utilizzare
per recuperare la risorsa.
Sebbene la classe R sia il punto in cui vengono specificati gli ID risorsa, non devi
cercare lì per scoprire un ID risorsa. Un ID risorsa è sempre composto da quanto segue:
- Il tipo di risorsa: ogni risorsa è raggruppata in un "tipo", ad esempio
string,drawableelayout. Per saperne di più sui diversi tipi, consulta Panoramica dei tipi di risorse. - Il nome della risorsa, ovvero il nome del file
esclusa l'estensione o il valore dell'attributo XML
android:name, se la risorsa è un valore semplice, ad esempio una stringa.
Esistono due modi per accedere a una risorsa:
- Nel codice:utilizzando un numero intero statico di una sottoclasse della classe
R, ad esempio:R.string.hello
stringè il tipo di risorsa ehelloè il nome della risorsa. Esistono molte API Android che possono accedere alle tue risorse quando fornisci un ID risorsa in questo formato. Per ulteriori informazioni, consulta la sezione Accedere alle risorse nel codice. - In XML:utilizzando una sintassi XML speciale che corrisponde
all'ID risorsa definito nella classe
R, ad esempio:@string/hello
stringè il tipo di risorsa ehelloè il nome della risorsa. Puoi utilizzare questa sintassi in una risorsa XML in qualsiasi punto in cui è previsto un valore che fornisci in una risorsa. Per ulteriori informazioni, consulta la sezione Accedere alle risorse da XML.
Accedere alle risorse nel codice
Puoi utilizzare una risorsa nel codice passando il relativo ID come parametro del metodo. Ad esempio, puoi impostare un ImageView per utilizzare la risorsa res/drawable/myimage.png utilizzando setImageResource():
Kotlin
val imageView = findViewById(R.id.myimageview) as ImageView imageView.setImageResource(R.drawable.myimage)
Java
ImageView imageView = (ImageView) findViewById(R.id.myimageview); imageView.setImageResource(R.drawable.myimage);
Puoi anche recuperare singole risorse utilizzando i metodi in Resources, di cui puoi ottenere un'istanza
con getResources().
Sintassi
Ecco la sintassi per fare riferimento a una risorsa nel codice:
[<package_name>.]R.<resource_type>.<resource_name>
<package_name>è il nome del pacchetto in cui si trova la risorsa (non obbligatorio quando si fa riferimento a risorse del tuo pacchetto).<resource_type>è la sottoclasseRper il tipo di risorsa.<resource_name>è il nome del file della risorsa senza l'estensione o il valore dell'attributoandroid:namenell'elemento XML, per valori semplici.
Per ulteriori informazioni su ciascun tipo di risorsa e su come farvi riferimento, consulta Panoramica dei tipi di risorse.
Casi d'uso
Esistono molti metodi che accettano un parametro ID risorsa e puoi recuperare le risorse utilizzando i metodi in Resources. Puoi
ottenere un'istanza di Resources utilizzando Context.getResources().
Ecco alcuni esempi di accesso alle risorse nel codice:
Kotlin
// Load a background for the current screen from a drawable resource. window.setBackgroundDrawableResource(R.drawable.my_background_image) // Set the Activity title by getting a string from the Resources object, because // this method requires a CharSequence rather than a resource ID. window.setTitle(resources.getText(R.string.main_title)) // Load a custom layout for the current screen. setContentView(R.layout.main_screen) // Set a slide in animation by getting an Animation from the Resources object. flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.hyperspace_in)) // Set the text on a TextView object using a resource ID. val msgTextView = findViewById(R.id.msg) as TextView msgTextView.setText(R.string.hello_message)
Java
// Load a background for the current screen from a drawable resource. getWindow().setBackgroundDrawableResource(R.drawable.my_background_image) ; // Set the Activity title by getting a string from the Resources object, because // this method requires a CharSequence rather than a resource ID. getWindow().setTitle(getResources().getText(R.string.main_title)); // Load a custom layout for the current screen. setContentView(R.layout.main_screen); // Set a slide in animation by getting an Animation from the Resources object. flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.hyperspace_in)); // Set the text on a TextView object using a resource ID. TextView msgTextView = (TextView) findViewById(R.id.msg); msgTextView.setText(R.string.hello_message);
Attenzione: non modificare manualmente il file R.java. Viene generato dallo strumento aapt quando il progetto viene
compilato. Eventuali modifiche vengono ignorate alla successiva compilazione.
Accedere alle risorse da XML
Puoi definire i valori per alcuni attributi ed elementi XML utilizzando un riferimento a una risorsa esistente. Spesso lo fai quando crei file di layout per fornire stringhe e immagini per i tuoi widget.
Ad esempio, se aggiungi un Button al layout, utilizza
una risorsa stringa per il testo del pulsante:
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/submit" />
Sintassi
Ecco la sintassi per fare riferimento a una risorsa in una risorsa XML:
@[<package_name>:]<resource_type>/<resource_name>
<package_name>è il nome del pacchetto in cui si trova la risorsa (non obbligatorio quando si fa riferimento a risorse dello stesso pacchetto).<resource_type>è la sottoclasseRper il tipo di risorsa.<resource_name>è il nome del file della risorsa senza l'estensione o il valore dell'attributoandroid:namenell'elemento XML, per valori semplici.
Per ulteriori informazioni su ciascun tipo di risorsa e su come farvi riferimento, consulta Panoramica dei tipi di risorse.
Casi d'uso
In alcuni casi, devi utilizzare una risorsa per un valore in XML, ad esempio per applicare un'immagine disegnabile a un widget, ma puoi anche utilizzare una risorsa in XML in qualsiasi punto che accetti un valore semplice. Ad esempio, se hai il seguente file di risorse che include una risorsa di colore e una risorsa di stringa:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="opaque_red">#f00</color> <string name="hello">Hello!</string> </resources>
Puoi utilizzare queste risorse nel seguente file di layout per impostare il colore del testo e la stringa di testo:
<?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="@color/opaque_red" android:text="@string/hello" />
In questo caso, non devi specificare il nome del pacchetto nel riferimento alla risorsa, perché le risorse provengono dal tuo pacchetto. Per fare riferimento a una risorsa di sistema, devi includere il nome del pacchetto, come mostrato nell'esempio seguente:
<?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="@android:color/secondary_text_dark" android:text="@string/hello" />
Nota:utilizza sempre le risorse stringa, in modo che l'applicazione possa essere localizzata per altre lingue. Per informazioni sulla creazione di risorse alternative (ad esempio stringhe localizzate), consulta Fornire risorse alternative. Per una guida completa alla localizzazione dell'applicazione per altre lingue, consulta Localizzare l'app.
Puoi anche utilizzare le risorse in XML per creare alias. Ad esempio, puoi creare una risorsa disegnabile che sia un alias per un'altra risorsa disegnabile:
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/other_drawable" />
Sembra ridondante, ma può essere molto utile quando si utilizza una risorsa alternativa. Per saperne di più, consulta la sezione sulla creazione di risorse alias.
Attributi di stile di riferimento
Una risorsa attributo di stile ti consente di fare riferimento al valore di un attributo nel tema attualmente applicato. Il riferimento a un attributo di stile ti consente di personalizzare l'aspetto degli elementi UI applicando uno stile che corrisponda alle variazioni standard fornite dal tema corrente, anziché fornire un valore hardcoded. Il riferimento a un attributo di stile indica essenzialmente: "Utilizza lo stile definito da questo attributo nel tema corrente".
Per fare riferimento a un attributo di stile, la sintassi del nome è quasi identica al formato normale della risorsa, ma anziché il simbolo "@" (@), utilizza un punto interrogativo (?). La parte del tipo di risorsa è facoltativa. Pertanto, la sintassi del riferimento è la seguente:
?[<package_name>:][<resource_type>/]<resource_name>
Ad esempio, ecco come puoi fare riferimento a un attributo per impostare il colore del testo in modo che corrisponda al colore del testo secondario del tema di sistema:
<EditText id="text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="?android:textColorSecondary" android:text="@string/hello_world" />
Qui, l'attributo android:textColor specifica il nome di un attributo di stile
nel tema corrente. Ora Android utilizza il valore applicato all'attributo di stile android:textColorSecondary
come valore per android:textColor in questo widget. Poiché lo strumento
di risorse di sistema sa che in questo contesto è prevista una risorsa di attributo,
non è necessario specificare esplicitamente il tipo, ovvero
?android:attr/textColorSecondary. Puoi escludere il tipo attr.
Accedere ai file originali
Anche se non è comune, potresti dover accedere ai file e alle directory originali. In questo caso, il salvataggio dei file in res/ non funzionerà, perché l'unico modo per leggere una risorsa da res/ è con l'ID risorsa. Puoi invece salvare le risorse nella directory assets/.
Ai file salvati nella directory assets/ non viene assegnato un ID risorsa, pertanto non puoi farvi riferimento tramite la classe R o dalle risorse XML. Puoi invece eseguire query sui file nella directory assets/ come in un normale file system e leggere i dati non elaborati utilizzando AssetManager.
Tuttavia, se hai bisogno solo di leggere i dati non elaborati (ad esempio un file video o audio),
salva il file nella directory res/raw/ e leggi un flusso di byte utilizzando openRawResource().
Accedere alle risorse della piattaforma
Android contiene una serie di risorse standard, come stili, temi e layout. Per
accedere a queste risorse, qualifica il riferimento alla risorsa con il
nome del pacchetto android. Ad esempio, Android fornisce una risorsa di layout che puoi utilizzare per
gli elementi di elenco in un ListAdapter:
Kotlin
listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, myarray)
Java
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));
In questo esempio, simple_list_item_1 è una risorsa di layout definita dalla
piattaforma per gli elementi di un ListView. Puoi utilizzare questo elemento anziché creare
un layout personalizzato per gli elementi dell'elenco.
Fornire la migliore compatibilità dei dispositivi con le risorse
Affinché la tua app supporti più configurazioni di dispositivi, è molto importante che tu fornisca sempre risorse predefinite per ogni tipo di risorsa utilizzata dall'app.
Ad esempio, se la tua app supporta diverse lingue, includi sempre una directory values/ (in cui vengono salvate le stringhe) senza un qualificatore di lingua e regione. Se invece inserisci tutti i file di stringhe
in directory con un qualificatore di lingua e regione, l'app si arresta in modo anomalo quando viene eseguita
su un dispositivo impostato su una lingua non supportata dalle stringhe.
Se fornisci risorse
values/ predefinite, la tua app funziona correttamente, anche se l'utente non
capisce la lingua in cui viene visualizzata. È meglio di un arresto anomalo.
Allo stesso modo, se fornisci risorse di layout diverse in base all'orientamento dello schermo,
scegli un orientamento come predefinito. Ad esempio, anziché fornire risorse di layout in layout-land/ per l'orientamento orizzontale e layout-port/ per l'orientamento verticale, lascia una come predefinita, ad esempio
layout/ per l'orientamento orizzontale e layout-port/ per l'orientamento verticale.
Fornire risorse predefinite è importante non solo perché la tua app potrebbe essere eseguita su una configurazione che non avevi previsto, ma anche perché le nuove versioni di Android a volte aggiungono qualificatori di configurazione che le versioni precedenti non supportano. Se utilizzi un nuovo qualificatore di risorse, ma mantieni la compatibilità del codice con le versioni precedenti di Android, quando una versione precedente di Android esegue la tua app, si arresta in modo anomalo se non fornisci risorse predefinite, perché non può utilizzare le risorse denominate con il nuovo qualificatore.
Ad esempio, se il tuo minSdkVersion è impostato su 4 e qualifichi tutte le tue risorse disegnabili utilizzando la modalità Buio (night o notnight, aggiunti nel livello API 8), un dispositivo con livello API 4 non può accedere alle tue risorse disegnabili e si arresta in modo anomalo. In questo
caso, probabilmente vuoi che notnight siano le risorse predefinite, quindi escludi questo
qualificatore e inserisci le risorse disegnabili in drawable/ o drawable-night/.
In breve, per garantire la migliore compatibilità del dispositivo, fornisci sempre risorse predefinite per le risorse necessarie alla tua app per funzionare correttamente. Poi crea risorse alternative per configurazioni di dispositivi specifiche utilizzando i qualificatori di configurazione.
Esiste un'eccezione a questa regola: se il minSdkVersion della tua app è 4 o
superiore, non hai bisogno di risorse disegnabili predefinite quando fornisci risorse disegnabili alternative
con il qualificatore densità dello schermo. Anche senza risorse
disegnabili predefinite, Android può trovare la corrispondenza migliore tra le densità dello schermo alternative e scalare
le bitmap in base alle necessità. Tuttavia, per un'esperienza ottimale su tutti i tipi di dispositivi,
fornisci risorse disegnabili alternative per tutti e tre i tipi di densità.
Come Android trova la risorsa con la corrispondenza migliore
Quando richiedi una risorsa per la quale fornisci alternative, Android seleziona la risorsa alternativa da utilizzare in fase di runtime, a seconda della configurazione attuale del dispositivo. Per mostrare come Android seleziona una risorsa alternativa, supponiamo che le seguenti directory drawable contengano ciascuna versioni diverse delle stesse immagini:
drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/
Supponiamo che la configurazione del dispositivo sia la seguente:
Locale = en-GB
Orientamento dello schermo = port
Densità di pixel dello schermo = hdpi
Tipo di touchscreen = notouch
Metodo di inserimento del testo principale = 12key
Confrontando la configurazione del dispositivo con le risorse alternative disponibili, Android seleziona
i drawables da drawable-en-port.
Il sistema prende la decisione su quali risorse utilizzare con la seguente logica:
Figura 2. Diagramma di flusso che mostra come Android trova la risorsa con la corrispondenza migliore.
- Elimina i file di risorse che contraddicono la configurazione del dispositivo.
La directory
drawable-fr-rCA/viene eliminata perché contraddice le impostazioni internazionalien-GB.drawable/ drawable-en/
drawable-fr-rCA/drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/Eccezione:la densità di pixel dello schermo è l'unico qualificatore che non viene eliminato a causa di una contraddizione. Anche se la densità dello schermo del dispositivo è hdpi,
drawable-port-ldpi/non viene eliminato perché a questo punto ogni densità dello schermo viene considerata una corrispondenza. Per informazioni, vedi Panoramica sulla compatibilità schermo. - Trova il qualificatore con la precedenza più alta successiva nell'elenco (tabella 2). Inizia con MCC.
- Qualcuna delle directory di risorse include questo qualificatore?
- In caso contrario, torna al passaggio 2 ed esamina il qualificatore successivo. In questo esempio, la risposta è "no" finché non viene raggiunto il qualificatore di lingua.
- In caso affermativo, vai al passaggio 4.
- Elimina le directory delle risorse che non includono questo qualificatore. In questo esempio, il sistema
elimina tutte le directory che non includono un qualificatore di lingua:
drawable/drawable-en/ drawable-en-port/ drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/Eccezione: se il qualificatore in questione è la densità dei pixel dello schermo, Android seleziona l'opzione che corrisponde più da vicino alla densità dello schermo del dispositivo. In generale, Android preferisce ridurre le dimensioni di un'immagine originale più grande rispetto ad aumentare le dimensioni di un'immagine originale più piccola. Per saperne di più, consulta la Panoramica della compatibilità dello schermo.
- Ripeti i passaggi 2, 3 e 4 finché non rimane una sola directory. In questo esempio, l'orientamento
dello schermo è il successivo qualificatore per cui sono presenti corrispondenze.
Pertanto, le risorse che non specificano un orientamento dello schermo vengono eliminate:
drawable-en/drawable-en-port/drawable-en-notouch-12key/La directory rimanente è
drawable-en-port.
Sebbene questa procedura venga eseguita per ogni risorsa richiesta, il sistema ne ottimizza alcuni aspetti. Una di queste ottimizzazioni consiste nel fatto che, una volta nota la configurazione del dispositivo, è possibile eliminare le risorse alternative che non potranno mai corrispondere. Ad esempio, se la lingua di configurazione è l'inglese, qualsiasi directory di risorse con un qualificatore di lingua impostato su una lingua diversa dall'inglese non viene mai inclusa nel pool di risorse controllate (anche se una directory di risorse senza il qualificatore di lingua è comunque inclusa).
Quando seleziona le risorse in base ai qualificatori delle dimensioni dello schermo, il sistema utilizza risorse progettate per uno schermo più piccolo di quello attuale se non sono disponibili risorse più adatte. Ad esempio, uno schermo di grandi dimensioni utilizza risorse dello schermo di dimensioni normali, se necessario.
Tuttavia, se
le uniche risorse disponibili sono più grandi dello schermo attuale, il sistema
non le utilizza e l'app va in arresto anomalo se nessun'altra risorsa corrisponde alla configurazione
del dispositivo. Ciò accade, ad esempio, se tutte le risorse di layout sono taggate con il qualificatore xlarge,
ma il dispositivo ha uno schermo di dimensioni normali.
Nota:la precedenza del qualificatore (nella tabella 2) è più importante
del numero di qualificatori che corrispondono esattamente al dispositivo. Nell'esempio precedente, al passaggio quattro l'ultima scelta nell'elenco include tre qualificatori che corrispondono esattamente al dispositivo (orientamento, tipo di touchscreen e metodo di input), mentre drawable-en ha un solo parametro corrispondente (lingua). Tuttavia, la lingua ha una precedenza maggiore rispetto a questi altri qualificatori, quindi
drawable-port-notouch-12key viene eliminato.