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.
2024-10-14 Tipo/Autore: Davide Copelli {ing} Pubblicato da: CorsoAndroid.it