Autore Topic: [facile] Semplice esempio di Shared Preferences  (Letto 40810 volte)

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
[facile] Semplice esempio di Shared Preferences
« il: 11 Marzo 2010, 14:04:14 CET »
+13
Livello di difficoltà: facile
Versione SDK utilizzata: 1.6
Link al file compresso del progetto eclipse: file in allegato

In questo breve tutorial cercherò di illustrare un semplice utilizzo delle Shared Preferences.


La classe android.content.SharedPreferences permette agli sviluppatori di salvare dei settaggi applicativi in un file e condividerli nella applicazione stessa o tra tutte le applicazioni.
Il file dove vengono salvate queste applicazioni è presente nel path /data/data/<package_applicazione>/.
Android mette a disposizione un framework per gestire la persistenza dei dati e la presentazione dell'interfaccia per modificarli.

Il modo più semplice di interagire con questi dati prevede l'utilizzo del metodo che la classe Activity eredita dalla classe Context:
Codice (Java): [Seleziona]
public abstract SharedPreferences getSharedPreferences (String name, int mode)la quale accede a un'istanza della classe SharedPreferences associata a un nome e a un identificatore dei permessi di accesso da parte delle altre applicazioni.

Modalità d'accesso
Esistono varie modalità d'accesso (mode):
  • Context.MODE_PRIVATE: le preferenze potranno essere lette solo dall’ applicazione corrente (costante di default)
  • Context.MODE_WORLD_READABLE: tutte le applicazioni avranno permessi di sola lettura sulle preferenze
  • Context.MODE_WORLD_WRITEABLE: tutte le applicazioni avranno permessi di lettura e scrittura
  • Context.MODE_APPEND: se il file già esiste, le preferenze verranno scritte alla fine del file anziché cancellare le precedenti

Le informazioni saranno associate a un nome (MY_PREFERENCES).
Se le si vuole rendere private rispetto ad una particolare activity il metodo da utilizzare (questa volta della classe Activity) è il seguente:
Codice (Java): [Seleziona]
public SharedPreferences getPreferences(int mode)Il quale richiama il precedente metodo passando come mode il valore del parametro passato e come name il nome della classe dell'Activity stessa.

Accesso e modifica
La classe SharedPreferences non mette a disposizione dei metodi relativi a ciascun tipo di dato, ma funge da factory di implementazione dell'interfaccia SharedPreferences.Editor che gestisce l'aggiornamento delle informazioni analogamente alla gestione di una transazione.
È prevista l'esecuzione di un'operazione di commit() al fine di rendere effettive le modifiche apportate.

A tal proposito il codice allegato permette di salvare un'informazione testuale di configurazione per poi ritrovarla al momento delle esecuzioni successive dell'applicazione stessa.

Per quello che riguarda la lettura delle informazioni di configurazione al momento dell'avvio dell'applicazione è stato implementato il seguente codice:
Codice (Java): [Seleziona]
SharedPreferences prefs = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
String textData = prefs.getString(TEXT_DATA_KEY, "No Preferences!");
TextView outputView = (TextView) findViewById(R.id.outputData);
outputView.setText(textData);

Il metodo getSharedPreferences accede alle preferenze private dell'applicazione, da cui si è tentata la lettura del valore di chiave memorizzata nella costante TEXT_DATA_KEY da noi definita.

Nell'esempio si visualizza il valore letto in una TextView che alla prima esecuzione mostrerà un messaggio indicativo dell'assenza di informazioni ("No Preferences!").
In seguito l'utente può inserire un testo attraverso una EditText e salvarlo nelle preferenze con la selezione di un Button:
Codice (Java): [Seleziona]
SharedPreferences.Editor editor = prefs.edit();
EditText outputView = (EditText) findViewById(R.id.inputData);
CharSequence textData = outputView.getText();
if (textData != null) {
   editor.putString(TEXT_DATA_KEY, textData.toString());
   editor.commit();
}

Uscendo e rientrando nell'applicazione è possibile verificare la persistenza dei dati salvati tramite Shared Preferences.

La modalità utilizzata non permette di gestire un numero elevato di preferenze, per le quali servirebbe anche un'interfaccia grafica idonea.
A tal proposito il framework messo a disposizione da Android prevede la definizione dell'insieme di classi definite all'interno del package android.preferences a ciascuna delle quali corrisponde un elemento da utilizzare in un opportuno documento XML.

Sorgenti:
TutorialSharedPreferences.java
Codice (Java): [Seleziona]
public class TutorialSharedPreferences extends Activity {
        // Identificatore delle preferenze dell'applicazione
        private final static String MY_PREFERENCES = "MyPref";
        // Costante relativa al nome della particolare preferenza
        private final static String TEXT_DATA_KEY = "textData";

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                updatePreferencesData();
        }

        /**
         * Metodo di gestione del pulsante che salva le preferences
         *
         * @param view
         *            Riferimento al button premuto
         */

        public void savePreferencesData(View view) {
                // Otteniamo il riferimento alle Preferences
                SharedPreferences prefs = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
                // Otteniamo il corrispondente Editor
                SharedPreferences.Editor editor = prefs.edit();
                // Modifichiamo il valore con quello inserito nell'EditText
                EditText outputView = (EditText) findViewById(R.id.inputData);
                CharSequence textData = outputView.getText();
                if (textData != null) {
                        // Lo salviamo nelle Preferences
                        editor.putString(TEXT_DATA_KEY, textData.toString());
                        editor.commit();
                }
                updatePreferencesData();
        }

        private void updatePreferencesData(){
                // Leggiamo le Preferences
                SharedPreferences prefs = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);
                // Leggiamo l'informazione associata alla proprietà TEXT_DATA
                String textData = prefs.getString(TEXT_DATA_KEY, "No Preferences!");
                // Lo impostiamo alla TextView
                TextView outputView = (TextView) findViewById(R.id.outputData);
                outputView.setText(textData);
        }
}

main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextView
                android:id="@+id/TextView01"
                android:layout_height="wrap_content"
                android:text="Input Conf. Data"
                android:layout_alignBaseline="@+id/inputData" android:layout_width="120dip"></TextView>
        <EditText
                android:text=""
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/inputData"
                android:layout_toRightOf="@+id/TextView01"
                android:layout_alignParentRight="true"
                android:hint="Inserisci il valore"></EditText>
        <Button
                android:layout_below="@id/inputData"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="savePreferencesData"
                android:id="@+id/saveButton"
                android:text="Salva Preferences" android:layout_centerHorizontal="true"></Button>
        <TextView
                android:id="@+id/TextView02"
                android:layout_below="@id/saveButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Conf. Output"></TextView>
        <TextView
                android:layout_below="@id/TextView02"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignBaseline="@+id/TextView02"
                android:layout_toRightOf="@+id/TextView02"
                android:layout_alignParentRight="true"
                android:layout_alignLeft="@+id/inputData"
                android:id="@+id/outputData"></TextView>
</RelativeLayout>

Bibliografia:
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline daniele

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: +1
    • Mostra profilo
Re:[facile] Semplice esempio di Shared Preferences
« Risposta #1 il: 26 Marzo 2010, 17:38:13 CET »
0
Grazie per la semplice e chiara guida.

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:[facile] Semplice esempio di Shared Preferences
« Risposta #2 il: 28 Febbraio 2011, 14:28:54 CET »
0
Ho un problema con le shared preferences  e non capisco il perchè...
Ho la mia classe che estende activity, che in fase di onCreate fa:
Codice (Java): [Seleziona]
  private String getSharedPrefsAuth() {
        SharedPreferences settings = getSharedPreferences(Vars.PREFS, Context.MODE_PRIVATE);
        String auth = settings.getString(Vars.PREFS_AUTH, null);
        return auth;
    }

e questo funziona benissimo (o meglio, niente eccezioni).
Poi ho invece un'activity che scarica dei dati e poi chiama tramite singleton:
MyActivity.setSession(Session session).

Dentro a questa session io richiamo:
Codice (Java): [Seleziona]
 private void setSharedPrefs(String auth) {
            SharedPreferences settings = getSharedPreferences(Vars.PREFS, Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = settings.edit();
            editor.putString(Vars.PREFS_AUTH, auth);
            editor.commit();  
        }
    }
ma ottengo null pointer exception sulla prima riga!
Mi da null pointer sul contentWrapper ecc..
Da quello che si dice sul web è causa context mancante, ma io sono all'interno di Application! ho provato facendo getApplicationContext()
ho provato a fare instance.getSharedPref...
ma niente, sempre null pointer, perchè mai?
quello che mi turba è che durante l'onCreate la cosa funziona, durante il normale funzionamento non va niente...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:[facile] Semplice esempio di Shared Preferences
« Risposta #3 il: 28 Febbraio 2011, 18:08:19 CET »
+1
Mi rispondo da solo:
non gli andava bene ne this,ne getApplicationContext, ho dovuto passargli a mano il context ogni volta che richiamo la funzione... l'importante è che adesso va...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline pindol

  • Nuovo arrivato
  • *
  • Post: 48
  • Respect: +2
    • Mostra profilo
Re:[facile] Semplice esempio di Shared Preferences
« Risposta #4 il: 16 Giugno 2011, 11:02:06 CEST »
0
Io non ho capito dove devo andare a prendere il valore della variabile MY_PREFERENCES, ho provato a metere il nome del file xml dal quale carico il layout delle sharedpreferences ma non va, ho provato a mettere il nome della classe che ho creato per gestire le sharedpreferences ma non va nemmeno questo.
Grazie, Mattia

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:[facile] Semplice esempio di Shared Preferences
« Risposta #5 il: 16 Giugno 2011, 11:13:17 CEST »
0
Io non ho capito dove devo andare a prendere il valore della variabile MY_PREFERENCES, ho provato a metere il nome del file xml dal quale carico il layout delle sharedpreferences ma non va, ho provato a mettere il nome della classe che ho creato per gestire le sharedpreferences ma non va nemmeno questo.
Grazie, Mattia
Context | Android Developers, int)
dalla documentazione:
Citazione
Retrieve and hold the contents of the preferences file 'name', returning a SharedPreferences through which you can retrieve and modify its values. Only one instance of the SharedPreferences object is returned to any callers for the same name, meaning they will see each other's edits as soon as they are made.
Leggi e salva il contenuto delle preferenze nel file name....
Basta dargli un nome file,senza spazi e senza estensione
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline pindol

  • Nuovo arrivato
  • *
  • Post: 48
  • Respect: +2
    • Mostra profilo
Re:[facile] Semplice esempio di Shared Preferences
« Risposta #6 il: 16 Giugno 2011, 11:15:27 CEST »
0
Ho messo un nome a caso ma non va, ho copiato la funzione dal post sopra

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:[facile] Semplice esempio di Shared Preferences
« Risposta #7 il: 16 Giugno 2011, 11:32:42 CEST »
0
Ho messo un nome a caso ma non va, ho copiato la funzione dal post sopra
cosa significa non va? non salva, non riceve, da errore? in tal caso posta il logcat
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:[facile] Semplice esempio di Shared Preferences
« Risposta #8 il: 16 Giugno 2011, 11:37:12 CEST »
0
Ho messo un nome a caso ma non va, ho copiato la funzione dal post sopra

Ciao,
ma il tuo obbiettivo è quello di creare un'activity per settere le impostazioni della tua applicazione? Se così ti consiglio di usare PreferenceActivity. Qui trovi un esempio semplice.

denper
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline pindol

  • Nuovo arrivato
  • *
  • Post: 48
  • Respect: +2
    • Mostra profilo
Re:[facile] Semplice esempio di Shared Preferences
« Risposta #9 il: 16 Giugno 2011, 11:37:37 CEST »
0
Non da nessun errore nel logcat, il codice che uso è il seguente:
Codice (Java): [Seleziona]
alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                  String value = input.getText().toString();
                  updatePref("nomepref", value);
                }
                });
e questa è la funzione updatePref
Codice (Java): [Seleziona]
public void updatePref(String pref, String newValue){
        SharedPreferences prefs = getSharedPreferences("preferences", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(pref, newValue);
        editor.commit();
    }

Offline pindol

  • Nuovo arrivato
  • *
  • Post: 48
  • Respect: +2
    • Mostra profilo
Re:[facile] Semplice esempio di Shared Preferences
« Risposta #10 il: 16 Giugno 2011, 11:40:19 CEST »
0
Si infatti la classe che gestisce le sharedpreferences estende la classe PreferenceActivity. A leggere i valori delle preferences non ho roblei, funziona tutto, il mio problema è che non riesco a modificarli fuori dalla classe che estende la preferencesActivity

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:[facile] Semplice esempio di Shared Preferences
« Risposta #11 il: 16 Giugno 2011, 11:42:36 CEST »
0
Prova con

Codice: [Seleziona]
PreferenceManager.setDefaultValues(context, R.xml.nameofpreferencesxmlfile, false);
SharedPreferences prefs  = PreferenceManager.getDefaultSharedPreferences(context);
« Ultima modifica: 16 Giugno 2011, 11:46:57 CEST da denper »
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline pindol

  • Nuovo arrivato
  • *
  • Post: 48
  • Respect: +2
    • Mostra profilo
Re:[facile] Semplice esempio di Shared Preferences
« Risposta #12 il: 16 Giugno 2011, 11:47:36 CEST »
0
No comment, lo avevo usato 50 righe sopra.. Grazie mille!

Offline Vlad

  • Utente normale
  • ***
  • Post: 271
  • Respect: +16
    • Github
    • Google+
    • vmihalachi
    • vmihalachi
    • Mostra profilo
    • vmihalachi.com
  • Dispositivo Android:
    Samsung galaxy s2 | Samsung galaxy tab 7
  • Play Store ID:
    Vlad Mihalachi
  • Sistema operativo:
    Windows 8
Re:[facile] Semplice esempio di Shared Preferences
« Risposta #13 il: 07 Settembre 2011, 17:40:55 CEST »
0
ciao a tutti il ringrazio per il tutorial che va alla grande ma cosa dovrei aggiungere per far si che anche le checkbox cliccate rimangano cliccate anche al termine della activity ? ???

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:[facile] Semplice esempio di Shared Preferences
« Risposta #14 il: 07 Settembre 2011, 17:50:42 CEST »
0
quali checkbox?
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia