In questo articolo vediamo come gestire le stringhe durante la realizzazione di una app per Android.

Quando realizziamo un programma, è buona norma evitare di utilizzare valori hard-coded nel codice. Questo si traduce in Android (fra le altre cose), nell’ evitare di utilizzare stringhe direttamente dove vengono usate.

Quindi, istruzioni del tipo:

mEditText.setText("La mia prima App!);

Sono da evitare. Anche AndroidStudio ci suggerirà di evitare questa pratica, per utilizzare invece una stringa definita in un file di risorse.

Quello che dovremmo fare quindi, è creare all’ interno della cartella Resources, una directory Values; e dentro a questa creare un file .xml (con nome arbitrario, per convenzione comunque si usa strings) che conterrà tutte le stringhe della nostra applicazione.

In questo modo, oltre che facilitare fortemente la manutenibilità del codice, permette anche di implementare la traduzione dell’ app in diverse lingue.

Inoltre, tramite Android Studio, avremo la possibilità di usare un addon built-in per aggiungere stringhe e traduzioni, tramite uno strumento grafico a tabella.

Input ad una stringa

A volte potrebbe essere necessario avere parte di una stringa che cambi asseconda di vari fattori (es: il nome dell’ utente). Vediamo quindi un esempio pratico di una stringa con variabili.

Abbiamo creato un file manager, e vogliamo stampare il numero di file presenti all’ interno della directory che l’ utente stà visualizzando.

Probabilmente prima della lista di file contenuti dalla directory, avremo una textview contentente il numero di file, scritto nella forma:

Ci sono 0 oggetti, C'è 1 oggetto, Ci sono 2 oggetti, ecc

Questo vuol dire, che il nostro file strings.xml si presenterà come questo:



 Ci sono 0 oggetti
 C'è 1 oggetto
 Ci sono 2 oggetti

E nel nostro codice avremo qualcosa del tipo:

[...]
String numeroOggetti;
switch(numeroDiOggetti)
{
 case 0: 
    numeroOggetti = getString(R.string.zero_oggetti);
    break;
 case 1: 
    numeroOggetti = getString(R.string.uno_oggetti);
    break;
 case 2: 
    numeroOggetti = getString(R.string.due_oggetti);
    break;
}
mTextView.setText(numeroOggetti);

Mettiamo caso che finiamo in una directory con tre oggetti. Dovremo manualmente aggiungere la stringa apposita al file delle stringhe:



 Ci sono 0 oggetti
 C'è 1 oggetto
 Ci sono 2 oggetti
 Ci sono 3 oggetti

Ed aggornare di conseguenza lo Switch. E se abbiamo una directory con quattro oggetti?

Avrai capito che questo meccanismo non può funzionare bene. Per venirci incontro Android ci dà la possibilità di passare dell’ input alle stringhe, usando questa sintassi:



C'è 1 oggetto
Ci sono $1%s oggetti 

Per poterlo utilizzare, abbiamo due alternative:

Usare l’apposito metodo getString(): grazie all’ overloading del metodo getString, abbiamo la possibilità di fare

getString(R.string.numero_file, 1);

Usando il metodo di String, format:

String.format(res.getString(R.string.numero_file), 1);

All’ interno del codice poi, dovremo dire:

[...]
if(numeroDiOggetti == 1)
{
    mTextview.setText(getString(R.string.un_oggetto));
}
else
{
    mTextview.setText(getString(R.string.n_oggetti, 1));
}

Non male rispetto a prima no? Ma possiamo fare meglio?
origin-of-modern-programming-languages-no-strings

Usiamo i plurals

I plurals sono un altro meccanismo comodo implementato da Android per gestire proprio questi casi.

All’ interno del file strings, dovremo definire un plurals e usare questo per definire tutti i vari casi.

   C'è un oggetto.
   Ci sono $1%s oggetti

Per usarlo poi, facciamo semplicemente:

 mTextview.setText(getResources().getQuantityString(R.plurals
 .n_oggetti,numeroDiOggetti));

Creare degli array

Come ultimo argomento riguardante le stringhe, è possibile definire anche degli array. All’ interno del file strings (o se ne avete tante potreste pensare di creare un file a parte), definiamo un elemento array in questo modo:



    
        Sabato
        Domenica
    

Per usarlo all’ interno del codice poi, ci basta fare:

String[] festivi = getResources().getStringArray(R.array.giorni_festivi);

e ci ritroveremo i giorni festivi definiti nel file strings.xml, all’ interno della variabile festivi!

Per approfondire: http://developer.android.com/guide/topics/resources/string-resource.html