Home > Guide e tutorial per Android > Programmazione Avanzata: Lezione 3 – SharedPreferences

Programmazione Avanzata: Lezione 3 – SharedPreferences

PA 3Oggi 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.

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.

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).

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 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ì:

due_layout

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.

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”
Possiamo naturalmente sfruttare questa lezione come base per applicazioni ben più complesse.

Per le altre lezioni visualizza l’indice del corso di programmazione avanzata.