Il sistema delle risorse – Lezione 8 di Android

La gestione delle risorse tramite file XML e qualificatori

Le risorse in un’applicazione Android sono i dati che l’app utilizzerà durante la propria esecuzione. Le risorse in un’app possono essere suddivise in due categorie:

  • resources, dati la cui struttura è nota al framework;
  • assets, altri dati.

A differenza delle resources, gli asset non vengono gestiti e al momento della creazione del file apk per la distribuzione dell’applicazione vengono aggiunti direttamente al file; I dati contenuti in resouces vengono gestiti da un apposito manager che al momento della compilazione del progetto effettua i seguenti passi:

  1. Converte i file XML contenuti nella cartella res in formato binario;
  2. Crea una tabella di corrispondenza fra gli ID numerici e offset nel formato binario;
  3. Genera una classe Java (in gen/R.java) che contiene tanti campi (di tipo final static) quante sono le risorse, per ognuna memorizzerà:
    1. Nome del campo, ovvero il nome della risorsa (public static final);
    2. Inner class, il tipo della risorsa (public static final);
    3. Valore, ID numerico della risorsa;
  4. Infine compila la classe R (public final), che entra nello spazio dei nomi del progetto;

Per ogni risorsa, Android consente di definire un valore di default ed un certo numero di valori alternativi. A runtime, quando si accede alla risorsa verrà selezionata l’alternativa più specifica adatta alla situazione. Nel codice, per poter accedere al valore di una risorsa bisogna utilizzare un identificativo della risorsa che viene creato grazie al binding del framework (classe R).

I tipi di risorse che possono essere utilizzate in Android sono:

  • Animation
  • Bool
  • Color
  • Color state list
  • Dimension
  • Drawable
  • ID
  • Integer
  • Integer array
  • Menu
  • String
  • Raw (tramite API)
  • Style
  • Typed array
  • XML (tramite API)

Come dichiare le risorse in Android

Per poter definire il valore delle risorse in Android esistono vari metodi, uno di questi è quello di utilizzare i tag XML (metodo consigliato). Ad esempio, per definire una risorsa di tipo stringa dovremo modificare il file strings.xml in res/values in questo modo:

  <?xml version="1.0" encoding="utf-8"?>
  <resources>

  // Risorsa "var_saluto" con valore "Hello World"
  <string name="var_saluto">Hello World</string>

  // Risorsa "app_name" con valore "HelloWorldDatrevo"
  <string name="app_name">HelloWorldDatrevo</string>

  </resources>

  // TextView in un file XML, riferimento alla risorsa var_saluto
  <TextView android:layout_width="fill_parent"
  android:layout_height="wrap_content"

  // Valore della variabile var_saluto nel file string.xml
  android:text="@string/var_saluto" />

L’utilizzo dei file XML per la gestione delle risorse è vivamente consigliato in Android, in questo modo è possibile suddividere il codice vero e proprio (contenuto nei file Java in src) dai dati contenuti nella cartella res, Nella nostra prima app HelloWorldDatrevo abbiamo definito il valore delle risorse direttamente nel file .java, questo metodo è estremamente sconsigliato per svariate ragioni, una tra questa è nel caso di applicazioni multilingua. Utilizzare dei semplici file XML con i testi per ogni lingua ci consente di poter tradurre la nostra applicazione in qualsiasi lingua senza dover modificare ogni volta il codice Java.

Un altro metodo per poter definire una risorse di tipo stringa è tramite la classe R.java che viene generata automaticamente dal sistema:

  /* AUTO-GENERATED FILE. DO NOT MODIFY. */
  public final class R {
    public static final class string {
      public static final int app_name=0x7f040001;
      public static final int var_saluto=0x7f040000;
    }
  }

Qualificatori, valori alternativi delle risorse in Android

Per poter accedere ad una risorsa, bisogna conoscere il suo nome, il tipo e il package (se esterna al pacchetto). Nello specifico, in un file XML si fa riferimento ad una risorsa nel seguente modo:

@[package:]tipo_risorsa/nome_risorsa

Mentre in un file Java, dovremo scrivere:

[package.]R.tipo_risorsa.nome_risorsa

In commercio si trovano dispositivi Android di ogni tipologia: con schermi grandi, schermi piccoli, con risorse hardware limitate, ecc. Per questo motivo, in Android consente di poter specificare un grande numero di valori alternativi al valore di default delle risorse. Ad esempio per le risorse di tipo layout è possibile specificare sia il layout quando il dispositivo si trova in verticale, sia il layout orizzontale per quando il dispositivo verrà inclinato. Un altro esempio sono le applicazioni tradotte in più lingue, in base al paese, l’app utilizzerà i testi tradotti nella lingua di quel paese.
Per poter specificare risorse alternative si fa uso dei cosiddetti qualificatori e si creano apposite directory in res del tipo: res/tipo_qualificatore/file_risorsa

SIM e rete. Esistono molti tipi di qualificatori, ad esempio quelli delle schede SIM e della rete, che con l’utilizzo del Mobile Country Code o del Mobile Network Code consentono l’identificazione delle stazioni cellulari degli operatori telefonici a cui i dispositivi sono collegati. Questi qualificatori utilizzano il formato -mccMCC e -mncMNC. Ad esempio, il codice -mcc222 indica l’Italia mentre il codice , -mcc222-mnc088 indica Wind Italia.

MCC MNC Marca Operatore Note
222 001 TIM Telecom Italia
222 002 Elsacom Ritirato
222 010 Vodafone Vodafone Omnitel N.V.
222 030 RFI Rete Ferroviaria Italiana
222 077 IPSE 2000 Ritirato
222 088 Wind Wind Telecomunicazioni SpA
222 098 Blu Ritirato
222 099 3 Italia Hutchison 3G

Lingua e regione. In Android esistono i qualificatori per la lingua e la regione del dispositivo e seguono il formato -lingua-rREGIONE, ad esempio il codice -it-rIT indica l’italiano utilizzato in Italia, mentre -it-rCH indica l’italiano in Canton Ticino, -en-rUS indica l’inglese utilizzato negli USA mentre -es-rUS denota lo spagnolo parlato degli Stati Uniti. Spesso le varie regioni dei paesi (IT, FR, GB, ES, ecc.) coincidono con le lingue parlate (it, fr, en, es, ecc.), queste convenzioni fanno riferimento agli standard ISO-639 e ISO-3166.

ISO-3166-1 Mappa Europa

Schermo. I qualificatori Android per lo schermo dei device sono numerosi e consentono di definire parametri come:

  • Dimensione minima, il formato utilizzato è -swNdp. Ad esempio -sw200dp indica che ci ci debbano essere almeno 200 pixel lungo l’asse minore dello schermo;
  • Dimensione dello schermo in larghezza, formato: -wNdp. Per avere uno schermo con minimo 500 pixel in larghezza scriveremo -w500dp;
  • Dimensione dello schermo in altezza, con il formato -hNdp ad esempio è lecito poter scrivere -h400dp;
  • Dimensione generica dello schermo, il formato -dimensione può essere: -small, -normal, -large, -xlarge;
  • Aspetto dello schermo (in rapporto w:h), può essere di differenti tipi, ad ad esempio: -long (stile 16:9), -notlong (stile 4:3);
  • Orientamento dello schermo, grazie al formato -orientamento avremo: -port (portrait), -land (landscape);
  • Tipo di touch screen, con il formato -tipotouch possiamo indicare -notouch per nessun touch disponibile, -stylus se si utilizza la penna e -finger per il dito.

Ambiente. Questo tipo di qualificatore tiene conto delle condizioni esterne in cui si trova il dispositivo, ad esempio:

  • Dock mode, indica se il dispositivo è in un dock. Con il formato -dockmode possiamo sapere se è installato in un auto (-car), su una scrivania (-desk), ecc;
  • Night mode, consente di sapere se è giorno o notte. Il formato è del tipo -nightmode: -night, per la notte, e -notnight per il giorno.

Input. I qualificatori di input consentono di conoscere informazioni sui device di input, ad esempio lo stato di una tastiera (-keysexposed, -keyshidden, -keyssoft), il formato (-nokeys, -qwerty, -12key), i tasti di navigazione (-navexposed, -navhidden), ecc.

Versione OS. Alcuni qualificatori consentono di conoscere la versione di Android (API level) attualmente utilizzata, ad esempio -v9 indica la versione Gingerbread, il formato -v3 indica la versione Android Cupcake con API level 3, -v19 indica la versione KitKat, ecc.

Si possono indicare più qualificatori in sequenza bisogna seguire però l’ordine con cui sono stati appena descritti altrimenti la directory verrà scartata e non sarà mai utilizzata. Ad esempio, se vogliamo che l’app abbia un determinato sfondo solo se è buio, ci troviamo in Francia, la lingua dell’utente è l’Italiano e utilizza la penna per interagire con il dispositivo, possiamo scrivere:
res/drawable-it-rFR-night-stylus/wallpaper.jpg
Per maggiori informazioni e per avere la lista completa dei qualificatori Android è possibile fare riferimento alla guida ufficiale di Android disponibile online.

Algoritmo utilizzato dal Resource Manager per determinare la configurazione migliore dei valori delle variabili

A runtime, chi determina i valori più specifici da adottare prende il nome di Resource Manager che segue il seguente algoritmo:

  1. Elimina qualsiasi configurazione contraddittoria;
  2. Identifica il prossimo qualificatore in base all’ordine: MCC per primo, poi MNC, poi la lingua e così via.
  3. Qualche directory utilizza questo qualificatore?
    • NO, torna al passo 2;
    • SI, prosegui al passo 4.
  4. Elimina le directory che non includono questo qualificatore. E’ rimasta solo una directory?
    • NO, ritorna al passo 2.
    • SI, directory più specifica trovata.

A questo indirizzo potete trovare un flow chart dell’algoritmo appena descritto.

Ogni qualvolta la configurazione del dispositivo varia, il sistema riavvia l’Activity con il nuovo insieme di risorse migliori a meno che non sia stato espressamente dichiarato che sia l’Activity ad occuparsi “manualmente” del cambiamento di configurazione. In questo caso l’Activity dovrà richiamare un suo metodo con il compito di dover aggiornare lo stato delle risorse.

Indice Lezione PrecedenteLezione Successiva

Pubblicato in Android, Android, Guide, Informatica, Programmazione Taggato con: , , , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*