
Oggi parleremo di come mantenere la persistenza di alcuni dati (come ad esempio le impostazioni e i settaggi utente) anche dopo la chiusura dell’applicazione, utilizzando la classe SharedPreferences.
[divider]
Spesso è necessario mantenere alcuni dati fra una sessione di utilizzo e un’altra. In questa lezione vedremo una semplice applicazione che memorizza il nome utente di una persona, ma con lo stesso sistema possiamo memorizzare molti altri tipi di dato a cui vogliamo accedere in seguito, anche dopo lo spegnimento del terminale.
[box type=”warning” align=”aligncenter” ]ATTENZIONE! In seguito utilizzeremo un codice senza l’inserimento e la gestione dei fragment. Poichè le nuove versioni di Eclipse alla creazione di un nuovo progetto genereranno automaticamente dei file, cancellateli e/o modificateli in modo da ottenere la stessa struttura dell’applicazione presentata (più semplice e adatta per scopi didattici).[/box]
Come sempre creiamo un nuovo progetto android, noi l’abbiamo chiamato SharedPreferencesExample. Per prima cosa creiamo 2 layout, uno verrà utilizzato solo se non abbiamo mai fatto il login, l’altro tutte le altre volte che apriamo l’applicazione.
Creiamo quindi i file activity_main.xml e activity_main2.xml
Nel primo inseriamo il codice seguente:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="Benvenuto!\nInserisci il tuo nome" android:textAppearance="?android:attr/textAppearanceLarge" /> <EditText android:id="@+id/nome" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" android:layout_marginTop="80dp" android:ems="10" android:inputType="textPersonName" /> <Button android:id="@+id/login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/nome" android:layout_centerHorizontal="true" android:layout_marginTop="100dp" android:text="Login" /> </RelativeLayout>
Nel secondo invece inseriamo quest’altro codice:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="Bentornato" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/nome_salvato" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" android:layout_marginTop="25dp" android:text="" android:textAppearance="?android:attr/textAppearanceLarge" /> </RelativeLayout>
Il due layout dovrebbero apparire quindi così:
Come vedete il layout è molto semplice e non presenta nulla di nuovo rispetto a quello visto nella guida base.
Passiamo ora alla parte relativa al codice Java, dove utilizzeremo la classe SharedPreferences.
Apriamo quindi il file MainActivity.java e modifichiamolo come segue:
package com.example.sharedpreferencesexample; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.example.sharedpreferencesexample.R; public class MainActivity extends Activity { SharedPreferences sp; Button login; EditText edit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sp = this.getSharedPreferences( "my_pref", Context.MODE_PRIVATE); /*Andiamo a controllare il campo "never_login", se questo non è mai stato modificato * otteniamo il valore di default (nel nostro caso impostato a "true"). */ boolean isFirstTime = sp.getBoolean("never_login", true); if(isFirstTime){ //Carichiamo il primo layout setContentView(R.layout.activity_main); edit = (EditText) findViewById(R.id.nome); login = (Button) findViewById(R.id.login); login.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { //Andiamo ad effettuare il login effettuaLogin(); } }); } else{ //Non è la prima volta, carichiamo l'altro layout setContentView(R.layout.activity_main2); //prendiamo il nome salvato l'altra volta String nome_utente = sp.getString("nome_utente", ""); TextView nome_salvato = (TextView) findViewById(R.id.nome_salvato); nome_salvato.setText(nome_utente); } } private void effettuaLogin(){ //Andiamo a prendere il nome String nome = edit.getText().toString(); //Controlliamo che sia stato inserito un nome if(nome==null || nome.length()==0){ //non è stato inserito nulla Toast.makeText(MainActivity.this, "Inserisci il nome", Toast.LENGTH_SHORT).show(); return; } //salviamo le informazioni per la prossima volta Editor editor = sp.edit();//Prendiamo l'editor editor.putBoolean("never_login", false); editor.putString("nome_utente", nome); editor.commit();//salviamo le modifiche //Notifichiamo che tutto è andato bene Toast.makeText(MainActivity.this, "Login effettuato!", Toast.LENGTH_SHORT).show(); } }
Andiamo ad esaminare il codice. All’inizio della onCreate() otteniamo tramite il metodo getSharedPreferences() un oggetto di tipo SharedPreferences relativo alla nostra activity, che possiamo vedere come un contenitore di dati. Da qui tramite i vari metodi get otteniamo i valori salvati, passando a questi metodi il nome (che funge qui da ID) della variabile salvata, o il valore di default se questa non è stata (ancora) salvata. Tramite l’oggetto Editor invece andiamo a inserire i vari dati, passando ai vari metodi put il nome identificativo e il valore da salvare.
Abbiamo quindi visto una semplice applicazione, di cui vi lasciamo il progetto completo da scaricare qui.
[box type=”info” align=”aligncenter”]Per importare un progetto estraete la cartella dove preferite (meglio se nel workspace) poi da Eclipse File -> Import -> Existing Android Code Into Workspace e tramite “Browse” andate a cercarvi il progetto. Se è già nel workspace, levate la spunta a “copy project into workspace”[/box]
Possiamo naturalmente sfruttare questa lezione come base per applicazioni ben più complesse.
Per le altre lezioni visualizza l’indice del corso di programmazione avanzata.