Richiamare le Risorse dal file XML

In questo tutorial del corso base vedremo come recuperare le stringhe e altre risorse, memorizzate all'interno di un file XML all'interno della cartella risorse.

Come già visto nel precedente tutorial su "Lavorare con le risorse", le stringhe sono la base per informare con dei messaggi di testo, colori, dimensione, l'utente della nostra applicazione.

Abbiamo anche accennato a come deve essere strutturato questo file xml. Vediamo ora come si possono inserire tali risorse e soprattutto come si posso poi recuperare sia per l'uso all'interno di un controllo, sia all'interno del codice java.

Cosa imparerai?

  • Imparerai a scrivere dei valori stringa all'interno di un file xml e a riconoscerli
  • Imparerai a recuperari valori stringa e non, per inserirli all'interno di un controllo
  • Imparerai a recuperare risorse in generale direttamente dal codice java in dinamico

Memorizzare coppie nome=valore nel file XML dentro alla cartella Values

La struttura base del file XML che conterrà tutte le nostre stringhe, è di questo tipo:

Percorso: res/values/string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">AndroidTutorial</string>
    <string name="hello_header">Welcome to my APP</string>
    <string name="menu_settings">Settings</string>
    <string name="welcome_main">Welcome to my APP</string>
    <string name="title_activity_page1">Page1</string>
    <string name="page_top">AndroidTutorial</string>
    <string name="title_activity_page2">Page2</string>
    <string name="button_go">GO!</string>
​</resources>

Così come avviene per i tag HTML, in questo caso il tag che si usa è:

<string>  VALORE della STRINGA   </string>

e in più per diversificarle le una dalle altre e avere così un sistema per "pescare"  una piuttosto che l'altra, si usa un attributo "name" che vedremo sara' spesso presente.

<string name="NOME a CUI RIFERIRSI">  VALORE della STRINGA   </string>

NB: Non devi ricordardi a memoria tali sintassi perchè grazie ad Eclipse o ADT, riuscirai ad inserire tali coppie in modo molto veloce (vedi video corso base)

Come recuperare una stringa e inserirla in un controllo

Come detto, i vantaggi di usare il grosso calderone dove memorizzare tutte le stringhe e poterle poi recuperare con il nostro mestolo, sono molteplici. Il più evidente è quello di poter avere un'unica posizione dove la stessa stringa è memorizzata, quindi con una sola modifica io sono in grado di modificare N elementi che la usano.

L'altro vantaggio è che è possibile sfruttare l'infrastruttura di Android, per gestire le lingue con cui la mia applicazione sarà realizzata, il tutto suddividendo le risorse sulla base di  cartella dal nome Values-<identificativo ISO 639-2 lingua> (es. it, en, de, uk, fr etc)

Quindi, un'applicazione che dovrà essere installata da utenti non solo italiani ma anche inglese o di lingua inglese, avrà all'interno sua la cartella values, sia la cartella values-en, la quale conterrà un diverso file strings.xml, con la traduzione delle stringhe da italiano a inglese.

Come visto nel tutorial "Anatomia di un Linear Layout", supponiamo allora di voler inserire il famoso testo "GO!" all'interno del bottone (<Button>) e di voler inserire il testo "Welcome to my APP" all'interno di un controllo <TextView>. Dal codice che vedi qui sotto, si nota chiaramente in quali punti sono state inserite le stringhe, tramite l'ausilio di Android Studio o Eclipse e la finestra proprietà.

Percorso: res/Layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:gravity="center|top"
  android:orientation="vertical" >

<ImageView
  android:id="@+id/imageView1"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:contentDescription="myapp"
  android:paddingBottom="20dp"
  android:paddingTop="30dp"
  android:src="@drawable/logo" />

<TextView
  android:id="@+id/textView1"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:clickable="false"
  android:text="Welcome to my APP" /> <!-- stringa direttamente nel controllo-->

<Button
  android:id="@+id/button1"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginTop="10dp"
  android:text="GO!!" /> <!-- stringa direttamente nel controllo -->
</LinearLayout>

Basandosi sul file string.xml precedente, noterai come abbia già memorizzato queste stringhe direttamente nel controllo, all'interno della riga 4 e 10, rispettivamente con il nome "hello_header" e "button_go".

Come faccio allora a recuperare con il nostro "MESTOLO" queste stringhe e inserirle nei rispettivi controlli? Si usa una notazione che abbiamo già intravisto in alcuni tutorial, che fa uso del simbolo @ seguito dal nome del tipo di risorsa e il nome della stringa.

Ad esempio per la stringa di nome "hello_header" e valore "Welcome to  my APP" sarà:

@string/hello_header    > equivale a scrivere la stringa "Welcome to my APP"

Per l'altra stringa di nome "button_go"  e valore "GO!" sarà:

@string/button_go    > equivale a scrivere la stringa "GO!"

E' chiaro allora come possa cambiare l'attrubuto text di ogni controllo. Nel primo caso diventerà:

<TextView
  android:id="@+id/textView1"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:clickable="false"
  android:text="@string/hello_header" /> <!-- stringa recuperata dalle risorse -->

mentre nel caso del bottone:

<Button
  android:id="@+id/button1"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginTop="10dp"
  android:text="@string/button_go" /> <!-- stringa recuperata dalle risorse -->

Questa tecnica può essere usata per qualsiasi risorse che troveremo dentro alla cartella res della nostra applicazione. Normalmente quindi lavoreremo con diversi calderoni di dati (string, layout, drawable), che sfrutteremo per evitare di scrivere nel controllo direttamente il valore.

  • @string/nomerisorsa          // per recuperare del testo, definito dentro al file values/strings.xml
  • @drawable/nomerisorsa     // per recuperare un'immagine, icona, definita dentro ad una cartella drawable
  • @layout/nomerisorsa         // per recuperare un layout definito dentro alla cartella layout
  • @color/nomerisorsa           // per recuperare un colore definito dentro al file values/color.xml

Avrai notato infatti, che nel layout definito sopra, in corrispondenza alla riga 15 del file main.xml, trovi la notazione @drawable/logo, che appunto permette di recuperare un’immagine di nome logo, definita all’interno della cartella drawable (una delle diverse presenti).

NB: Questa notazione @nome/risorsa è usata per recuperare le risorse DA ME inserite nell'applicazione. Vedremo che è possibile recuperare anche delle risorse predefinite di Android, con una notazione simile del tipo @android:nome/risorsa.

Quindi come regola generale, ricorda che non appena incontri la parola android, stai recuperando risorse definite da qualcun'altro dentro alla tua applicazione.

Come recuperare una risorsa e inserirla nel codice java

Non appena diventerai  un pò più esperto nella scrittura di codice java, avrai la necessità di accedere a particolari valori memorizzati proprio nei controlli.

Tipicamente non si recupererà mai il valore dell'attributo testo di un controllo TextView, ma ad esempio il suo id, oppure l'id di un campo di input compilato dall'utente (es. modulo di ricerca, inserimento del nome etc etc), oppure un identificativo id legato al nome di un bottone premuto, che mi permetta di capire, tra tanti bottoni, quello che l'utente ha schiacciato, oppure un particolare tipo di layout etc.

Ebbene tutto questo richiede l'accesso a livello di codice, agli attributi del controllo oppure alle risorse memorizzate nella cartella resource. In entrambi i casi la sintassi che dovrai utilizzare è la stessa: non prendere paura se per ora non ha ancora piena dimestichezza su come usarla nel tuo codice.

Per identificare una risorsa nella cartella res, useremo:

R.cartella.nomerisorsa  > per identificare una risorsa nella cartella res

Per identificare un attributo di un controllo, presente nell'attuale activity, useremo:

R.attributo.nomerisorsa  > per identificare un attr. di un controllo presente nell'attuale activity

NB: Attenzione che la lettera R deve essere scritta in maiuscolo.

Ecco alcuni esempi di come si può utilizzare all'interno del codice di un'Activity:

Esempio 1: Chiamo un'activity, recuperando un layout di nome "main", dalla cartella risorse Layout

setContentView(R.layout.main);

Esempio 2: Identifico il bottone GO! del mio layout, con attributo id="button1":

findViewById(R.id.button1);

e così via.

Tipo/Autore: Pubblicato da: CorsoAndroid.it

© 2011-2024 CorsoAndroid.it - Tutti i diritti riservati. Corso Base Android per rompere il ghiaccio Creare app per android
NB: Tutti i marchi citati sono di proprietà dei rispettivi proprietari. Android is a trademark of Google Inc.