[Android Lab] Shared Preferences

closeQuesto articolo è stato pubblicato 1 anno 10 mesi 23 giorni giorni fa quindi alcuni contenuti o informazioni presenti in esso potrebbero non essere più validi. Questo sito non è responsabile per eventuali errori causati da questo problema.

Oggi mi è stato chiesto se potessi fare un piccolo tutorial sulle Shared Preferences e come potrei non accontentare i miei lettori!!!

Cosa sono?

Le Shared Preferences permettono di salvare dei dati formati da una coppia chiave/valore (esattamente come in un dizionario) e renderli persistenti e recuperabili anche dopo la chiusura dell’applicazione, in questo modo possiamo salvare molto semplicemente alcuni dati importanti che vogliamo non vadano perduti. I tipi di dato che possiamo inserire sono i seguenti:

  • Boolean;
  • Float;
  • Int;
  • Long;
  • String;

Questo strumento però ci permette di fare molto di più! Ad esempio se abbiamo dei dati che vogliamo utilizzare in tutta l’applicazione invece di inviarli ad un activity all’altra utilizzando gli intent possiamo farlo tramite questo utile strumento. Questo metodo ci consente quindi di “snellire” l’applicazione evitando di avere dati ridondanti, e che appesantiscono la nostra applicazione.

Andiamo al sodo…

Abbiamo una classe denominata SharedPreferences che ci fornisce tutti gli strumenti di cui abbiamo bisogno senza complicarci troppo le cose. Come prima cosa dobbiamo utilizzare una SP questa può avere un nome (nel caso vogliamo crearne più di una, o se ci piace semplicemente tenere tutto sotto controllo) oppure essere anonima. Abbiamo due metodi per fare questo:

  • getSharedPreferences(String name, int mode):  abbiamo bisogno di specificare il nome della risorsa a cui vogliamo accedere e in che modalità (privata o accessibile a tutti);
  • getPreferences(int mode): come sopra ma abbiamo bisogno solo della modalità di accesso;

Dopo aver richiesto il file delle preferenze non ci resta che accedere in lettura/scrittura:

  • La lettura è estremamente semplice basta richiamare la preferenza come scritto sopra e richiedere il tipo di dato che ci interessa, ad esempio se è una stringa useremo getString(), un intero getInt() un boooleano getBoolean() e così via. Ogni metodo richiede due argomenti:
    1. La chiave utilizzata per memorizzare il dato;
    2. Un valore di default che sarà restituito nel caso non fosse stato trovato nessun dato;

// 0 corrisponde a modalità privata
SharedPreferences prefs = getSharedPreferences(prefsName, 0);
String nome = prefs.getString("Nome", "Nome non trovato");
  • La scrittura è un po più sofisticata poiché abbiamo bisogno di un oggetto della classe SharedPreferences.Editor per poter scrivere sul file. Fortunatamente la SharedPreference che andiamo ad utilizzare possiede già il necessario per poter scrivere su di essa, allora ci basterà invocare il metodo edit() e per poter scrivere ci basterà chiamare i metodi get<Type>() con il tipo di dato da inserire. Tutto quello che abbiamo fatto fin’ora però non va a scrivere direttamente sul file, ma per far questo dobbiamo eseguire commit() che conferma l’operazione:

SharedPreferences.Editor prefsEditor = prefs.edit();
prefsEditor.putString("Nome", "Emanuel");
prefsEditor.commit();

Questo è sostanzialmente tutto quello di cui c’è bisogno sapere, tutto molto semplice!

Lab

Bene ora apriamo Eclipse e proviamo a fare una piccola applicazione di esempio:

Creiamo la solita activity io l’ho chiamata SaveSharedActivity e nel layout ho aggiunto tre TextView:

  • Nome;
  • Cognome;
  • Email;

Tre EditText per inserire i campi sopraccitati e un bottone per passare alla seconda activity;

<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"
tools:context=".SaveSharedActivity" >
<EditText
android:id="@+id/eNome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/tNome"
android:layout_marginLeft="18dp"
android:layout_marginTop="16dp"
android:ems="10"
android:inputType="textPersonName" />

<TextView
android:id="@+id/tCognome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/eNome"
android:layout_below="@+id/eNome"
android:layout_marginTop="17dp"
android:text="Cognome" />

<TextView
android:id="@+id/tNome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/eNome"
android:layout_alignParentTop="true"
android:layout_marginTop="24dp"
android:text="Nome" />

<EditText
android:id="@+id/eCognome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/tCognome"
android:layout_below="@+id/tCognome"
android:layout_marginTop="25dp"
android:ems="10"
android:inputType="textPersonName" >

<requestFocus />
</EditText>

<TextView
android:id="@+id/tMail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/tNome"
android:layout_centerVertical="true"
android:text="Email" />

<EditText
android:id="@+id/eEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/tMail"
android:layout_below="@+id/tMail"
android:layout_marginTop="29dp"
android:ems="10"
android:inputType="textEmailAddress" />

<Button
android:id="@+id/next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="55dp"
android:text="Salva e prosegui" />
</RelativeLayout></pre>

Nell’activity creiamo un attributo con tipologia “public static final String” (in modo che sia accessibile in tutto il progetto senza restrizioni):

public class SaveSharedActivity extends Activity {
    public static final String SharedPrefName = "Shared";

Creiamo i tre EditText con il bottone:

    private EditText eNome;
    private EditText eCognome;
    private EditText eEmail;
    private Button saveAndGoBtn;

L’onCreate conterrà le inizializzazioni dei quatro campi e l’assegnazione di un azione al Button

    private OnClickListener saveAndGoAction = new OnClickListener() {
    @Override
    public void onClick(View v) {
        // Richiamiamo la nostra preferenza tramite il nome
        SharedPreferences prefs = getSharedPreferences(SharedPrefName, 0);
        // Per poterla editare abbiamo bisogno di un oggetto Editor che ci è fornito dalla SP stessa
        SharedPreferences.Editor prefsEditor = prefs.edit();
        // Inseriamo tutte le righe chiave/valore di cui necessitiamo
        prefsEditor.putString("Nome", eNome.getText().toString());
        prefsEditor.putString("Cognome", eCognome.getText().toString());
        prefsEditor.putString("Email", eEmail.getText().toString());
        // Eseguiamo il commit per scrivere effettivamente nel file
        prefsEditor.commit();
        Intent intent = new Intent(getApplicationContext(), PrintShared.class);
        startActivity(intent);
    }
};

Abbiamo recuperato la SP tramite il metodo getSharedPreferences() e gli abbiamo assegnato come nome quello creato poco fa. Qui avevamo necessità di scrivere e abbiamo a questo scopo creato un oggetto della classe SharedPreferences.Editor, abbiamo inserito tre stringhe con i valori degli EditText e infine è stato effettuato un intent per richiamare la seconda activity chiamata PrintShared.

Il layout di PrintShared è veramente basilare solo tre TextView di tipo Large in cui inserire i dati presenti nella SharedPreference.

<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"
tools:context=".PrintShared" >

<TextView
android:id="@+id/printNome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:text="Nome"
android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
android:id="@+id/printCognome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/printNome"
android:layout_centerHorizontal="true"
android:layout_marginTop="100dp"
android:text="Cognome"
android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
android:id="@+id/printEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/printCognome"
android:layout_centerHorizontal="true"
android:layout_marginTop="100dp"
android:text="Email"
android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

Mentre  l’activity contiene i tre attributi che si riferiscono alle TextView e nell’onCreate andiamo ad assegnargli i valori nella SharedPreference.

SharedPreferences prefs = getSharedPreferences(SaveSharedActivity.SharedPrefName, 0);
this.tNome.setText(prefs.getString("Nome", "Nome non trovato"));
this.tCognome.setText(prefs.getString("Cognome", "Cognome non trovato"));
this.tEmail.setText(prefs.getString("Email", "Email non trovata"));

Abbiamo acceduto al nome precedentemente creato per recuperare la preference e letto i dati che erano al suo interno tramite i tre getString().

FINE!

Ecco un anteprima:

sahredprefpreview

Vi allego i file del progetto che ho utilizzato:

SharedPreferences Android Lab (195)