Preferenze condivise Android per la creazione di attività singole (esempio) [chiuso]


295

Ho tre attività A, B e C in cui A e B sono moduli e dopo aver compilato e salvato i dati del modulo nel database (SQLITE). Sto usando l'intento da A a B e poi da B a C. Quello che voglio è che ogni volta che apro la mia app voglio C come schermata iniziale e non più A e B.

Immagino che le preferenze condivise funzionerebbero per questo, ma non riesco a trovare un buon esempio per darmi un punto di partenza. Qualsiasi aiuto sarebbe apprezzato.


10
Utilizzo delle preferenze condivise dal sito di sviluppo Android.
Onik,


12
Sto votando per riaprire questa domanda perché non sta davvero chiedendo una raccomandazione.
Suragch,

Risposte:


620

Impostazione dei valori in Preferenze:

// MY_PREFS_NAME - a static String variable like: 
//public static final String MY_PREFS_NAME = "MyPrefsFile";
SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
 editor.putString("name", "Elena");
 editor.putInt("idName", 12);
 editor.apply();

Recupera i dati dalle preferenze:

SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
String name = prefs.getString("name", "No name defined");//"No name defined" is the default value.
int idName = prefs.getInt("idName", 0); //0 is the default value.

Ulteriori informazioni:

Utilizzo delle preferenze condivise

Preferenze condivise


74
Valuta invece di applicare apply (); commit scrive immediatamente i suoi dati nella memoria persistente, mentre apply lo gestirà in background.
CodeNinja,

12
apply()è una chiamata asincrona per eseguire l'I / O su disco dove as commit()è sincrono. Quindi evita di chiamare commit()dal thread dell'interfaccia utente.
Aniket Thakur,

103

Crea SharedPreferences

SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE); 
Editor editor = pref.edit();

Memorizzazione dei dati come coppia KEY / VALUE

editor.putBoolean("key_name1", true);           // Saving boolean - true/false
editor.putInt("key_name2", "int value");        // Saving integer
editor.putFloat("key_name3", "float value");    // Saving float
editor.putLong("key_name4", "long value");      // Saving long
editor.putString("key_name5", "string value");  // Saving string

// Save the changes in SharedPreferences
editor.apply(); // commit changes

Ottieni i dati di SharedPreferences

// Se il valore per la chiave non esiste, restituisce il secondo valore param - In questo caso null

boolean userFirstLogin= pref.getBoolean("key_name1", true);  // getting boolean
int pageNumber=pref.getInt("key_name2", 0);             // getting Integer
float amount=pref.getFloat("key_name3", null);          // getting Float
long distance=pref.getLong("key_name4", null);          // getting Long
String email=pref.getString("key_name5", null);         // getting String

Eliminazione del valore chiave da SharedPreferences

editor.remove("key_name3"); // will delete key key_name3
editor.remove("key_name4"); // will delete key key_name4

// Save the changes in SharedPreferences
editor.apply(); // commit changes

Cancella tutti i dati da SharedPreferences

 editor.clear();
 editor.apply(); // commit changes

3
pref.getBoolean ("key_name1", null); non può essere nullo. Ha bisogno di un valore di defalut se non è stato memorizzato nulla.
Boris Karloff il

2
Faresti meglio ad applicare apply () invece di commit (). apply () è asincrono e lo eseguirai su un thread in background
Androider

Si arresta in modo anomalo se key_name3 o key_name4 sono null
TacB0sS

1
Ho una pagina di registro che memorizza le informazioni dell'utente e ho una pagina di accesso a cui l'utente accede con tali informazioni. Ho due classi, prendo informazioni una classe e voglio usare quelle informazioni l'altra classe. Quando uso il codice sopra nel mio codice. Prendo un'eccezione puntatore null. C'è un utilizzo come me? @ KrauszLórántSzilveszter
ZpCikTi

43

Come Intializzare?

// 0 - for private mode`
SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); 

Editor editor = pref.edit();

Come archiviare i dati nelle preferenze condivise?

editor.putString("key_name", "string value"); // Storing string

O

editor.putInt("key_name", "int value"); //Storing integer

E non dimenticare di applicare:

editor.apply();

Come recuperare i dati dalle preferenze condivise?

pref.getString("key_name", null); // getting String

pref.getInt("key_name", 0); // getting Integer

Spero che questo ti aiuti :)


L'inizializzazione è importante se
accedi

19

Puoi creare la tua classe SharedPreference personalizzata

public class YourPreference {   
    private static YourPreference yourPreference;
    private SharedPreferences sharedPreferences;

    public static YourPreference getInstance(Context context) {
        if (yourPreference == null) {
            yourPreference = new YourPreference(context);
        }
        return yourPreference;
    }

    private YourPreference(Context context) {
        sharedPreferences = context.getSharedPreferences("YourCustomNamedPreference",Context.MODE_PRIVATE);
    }

    public void saveData(String key,String value) {
        SharedPreferences.Editor prefsEditor = sharedPreferences.edit();
        prefsEditor .putString(key, value);
        prefsEditor.commit();           
    }

    public String getData(String key) {
        if (sharedPreferences!= null) {
           return sharedPreferences.getString(key, "");
        }
        return "";         
    }
}

Puoi ottenere l'istanza di YourPrefrence come:

YourPreference yourPrefrence = YourPreference.getInstance(context);
yourPreference.saveData(YOUR_KEY,YOUR_VALUE);

String value = yourPreference.getData(YOUR_KEY);

1
Valore stringa = yourPreference.getData (YOUR_KEY); Errore: non è possibile fare riferimento al contenuto non statico in un contesto statico
Jana Babu,

ciao istanza di Context mi stava dando nulla, quindi ho messo sharedPreferences = context.getSharedPreferences ("YourCustomNamedPreference", Context.MODE_PRIVATE); questa linea nel tentativo di catturare il blocco e il suo lavoro, ma la cosa è che perché dà null?
Ionico

Uso questa classe nel mio progetto e avvio le mie preferenze condivise in BaseActivity e utilizzo in altre attività (splashScreen e login e attività principale) per controllare lo stato di accesso dell'utente e uscire dall'app. Ma questo non funziona per Android 8 per l'uscita! Hai qualche suggerimento?
roghayeh hosseini,

17

Ho appena trovato tutti gli esempi sopra troppo confusi, quindi ho scritto il mio. I frammenti di codice vanno bene se sai cosa stai facendo, ma per quanto riguarda le persone come me che non lo fanno?

Vuoi invece una soluzione taglia e incolla? Bene eccolo qui!

Crea un nuovo file java e chiamalo Keystore. Quindi incolla questo codice:

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;

public class Keystore { //Did you remember to vote up my example?
    private static Keystore store;
    private SharedPreferences SP;
    private static String filename="Keys";

private Keystore(Context context) {
    SP = context.getApplicationContext().getSharedPreferences(filename,0);
}

public static Keystore getInstance(Context context) {
    if (store == null) {
        Log.v("Keystore","NEW STORE");
        store = new Keystore(context);
    }
    return store;
}

public void put(String key, String value) {//Log.v("Keystore","PUT "+key+" "+value);
    Editor editor = SP.edit();
    editor.putString(key, value);
    editor.commit(); // Stop everything and do an immediate save!
    // editor.apply();//Keep going and save when you are not busy - Available only in APIs 9 and above.  This is the preferred way of saving.
}

public String get(String key) {//Log.v("Keystore","GET from "+key);
    return SP.getString(key, null);

}

public int getInt(String key) {//Log.v("Keystore","GET INT from "+key);
    return SP.getInt(key, 0);
}

public void putInt(String key, int num) {//Log.v("Keystore","PUT INT "+key+" "+String.valueOf(num));
    Editor editor = SP.edit();

    editor.putInt(key, num);
    editor.commit();
}


public void clear(){ // Delete all shared preferences
    Editor editor = SP.edit();

    editor.clear();
    editor.commit();
}

public void remove(){ // Delete only the shared preference that you want
    Editor editor = SP.edit();

    editor.remove(filename);
    editor.commit();
}
}

Ora salva quel file e dimenticalo. Hai finito. Ora torna alla tua attività e usala in questo modo:

public class YourClass extends Activity{

private Keystore store;//Holds our key pairs

public YourSub(Context context){
    store = Keystore.getInstance(context);//Creates or Gets our key pairs.  You MUST have access to current context!

    int= store.getInt("key name to get int value");
    string = store.get("key name to get string value");

    store.putInt("key name to store int value",int_var);
    store.put("key name to store string value",string_var);
    }
}

Uso questa classe nel mio progetto e avvio le mie preferenze condivise in BaseActivity e utilizzo in altre attività (splashScreen e login e attività principale) per controllare lo stato di accesso dell'utente e uscire dall'app. Ma questo non funziona per Android 8 per l'uscita! Hai qualche suggerimento?
roghayeh hosseini,

15

Shared Preferencessono file XML per archiviare dati primitivi privati ​​in coppie chiave-valore. I tipi di dati includono booleani , float , ints , long e stringhe .

Quando vogliamo salvare alcuni dati accessibili in tutta l'applicazione, un modo per farlo è salvarli nella variabile globale. Ma svanirà una volta chiusa l'applicazione. Un altro modo consigliato è di salvare SharedPreference. I dati salvati nel file SharedPreferences sono accessibili in tutta l'applicazione e persistono anche dopo la chiusura dell'applicazione o al riavvio.

SharedPreferences salva i dati nella coppia chiave-valore e vi si può accedere allo stesso modo.

Puoi creare un oggetto SharedPreferencesusando due metodi,

1). getSharedPreferences () : Usando questo metodo puoi creare Multiple SharedPreferences.e i suoi primi parametri in nome di SharedPreferences.

2). getPreferences () : utilizzando questo metodo è possibile creare Single SharedPreferences.

Memorizzazione dei dati

Aggiungi una dichiarazione di variabile / Crea file di preferenze

public static final String PREFERENCES_FILE_NAME = "MyAppPreferences";

Recupera un handle per il nome file (usando getSharedPreferences)

SharedPreferences settingsfile= getSharedPreferences(PREFERENCES_FILE_NAME,0);

Apri Editor e aggiungi coppie chiave-valore

SharedPreferences.Editor myeditor = settingsfile.edit(); 
myeditor.putBoolean("IITAMIYO", true); 
myeditor.putFloat("VOLUME", 0.7)
myeditor.putInt("BORDER", 2)
myeditor.putLong("SIZE", 12345678910L)
myeditor.putString("Name", "Amiyo")
myeditor.apply(); 

Non dimenticare di applicare / salvare utilizzando myeditor.apply()come mostrato sopra.

Recupero dati

 SharedPreferences mysettings= getSharedPreferences(PREFERENCES_FILE_NAME, 0);
IITAMIYO = mysettings.getBoolean("IITAMIYO", false); 
//returns value for the given key. 
//second parameter gives the default value if no user preference found
// (set to false in above case)
VOLUME = mysettings.getFloat("VOLUME", 0.5) 
//0.5 being the default value if no volume preferences found
// and similarly there are get methods for other data types

13
public class Preferences {

public static final String PREF_NAME = "your preferences name";

@SuppressWarnings("deprecation")
public static final int MODE = Context.MODE_WORLD_WRITEABLE;

public static final String USER_ID = "USER_ID_NEW";
public static final String USER_NAME = "USER_NAME";

public static final String NAME = "NAME";
public static final String EMAIL = "EMAIL";
public static final String PHONE = "PHONE";
public static final String address = "address";

public static void writeBoolean(Context context, String key, boolean value) {
    getEditor(context).putBoolean(key, value).commit();
}

public static boolean readBoolean(Context context, String key,
        boolean defValue) {
    return getPreferences(context).getBoolean(key, defValue);
}

public static void writeInteger(Context context, String key, int value) {
    getEditor(context).putInt(key, value).commit();

}

public static int readInteger(Context context, String key, int defValue) {
    return getPreferences(context).getInt(key, defValue);
}

public static void writeString(Context context, String key, String value) {
    getEditor(context).putString(key, value).commit();

}

public static String readString(Context context, String key, String defValue) {
    return getPreferences(context).getString(key, defValue);
}

public static void writeFloat(Context context, String key, float value) {
    getEditor(context).putFloat(key, value).commit();
}

public static float readFloat(Context context, String key, float defValue) {
    return getPreferences(context).getFloat(key, defValue);
}

public static void writeLong(Context context, String key, long value) {
    getEditor(context).putLong(key, value).commit();
}

public static long readLong(Context context, String key, long defValue) {
    return getPreferences(context).getLong(key, defValue);
}

public static SharedPreferences getPreferences(Context context) {
    return context.getSharedPreferences(PREF_NAME, MODE);
}

public static Editor getEditor(Context context) {
    return getPreferences(context).edit();
}

}

**** Usa le Preferenze per scrivere il valore usando: - ****

Preferences.writeString(getApplicationContext(),
                    Preferences.NAME, "dev");

**** Usa le Preferenze per leggere il valore usando: - ****

Preferences.readString(getApplicationContext(), Preferences.NAME,
                    "");

7

Il modo migliore per creare SharedPreferencee per l'uso globale è necessario creare una classe come di seguito:

public class PreferenceHelperDemo {
    private final SharedPreferences mPrefs;

    public PreferenceHelperDemo(Context context) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(context);
    }

    private String PREF_Key= "Key";

    public String getKey() {
        String str = mPrefs.getString(PREF_Key, "");
        return str;
    }

    public void setKey(String pREF_Key) {
        Editor mEditor = mPrefs.edit();
        mEditor.putString(PREF_Key, pREF_Key);
        mEditor.apply();
    }

}

PreferenceManager.getDefaultSharedPreferences è deprecato
Guy4444

4
SharedPreferences mPref;
SharedPreferences.Editor editor;

public SharedPrefrences(Context mContext) {
    mPref = mContext.getSharedPreferences(Constant.SharedPreferences, Context.MODE_PRIVATE);
    editor=mPref.edit();
}

public void setLocation(String latitude, String longitude) {
    SharedPreferences.Editor editor = mPref.edit();
    editor.putString("latitude", latitude);
    editor.putString("longitude", longitude);
    editor.apply();
}

public String getLatitude() {
    return mPref.getString("latitude", "");
}

public String getLongitude() {
    return mPref.getString("longitude", "");
}

public void setGCM(String gcm_id, String device_id) {
     editor.putString("gcm_id", gcm_id);
    editor.putString("device_id", device_id);
    editor.apply();
}

public String getGCMId() {
    return mPref.getString("gcm_id", "");
}

public String getDeviceId() {
    return mPref.getString("device_id", "");
}


public void setUserData(User user){

    Gson gson = new Gson();
    String json = gson.toJson(user);
    editor.putString("user", json);
    editor.apply();
}
public User getUserData(){
    Gson gson = new Gson();
    String json = mPref.getString("user", "");
    User user = gson.fromJson(json, User.class);
    return user;
}

public void setSocialMediaStatus(SocialMedialStatus status){

    Gson gson = new Gson();
    String json = gson.toJson(status);
    editor.putString("status", json);
    editor.apply();
}
public SocialMedialStatus getSocialMediaStatus(){
    Gson gson = new Gson();
    String json = mPref.getString("status", "");
    SocialMedialStatus status = gson.fromJson(json, SocialMedialStatus.class);
    return status;
}

3

Scrivi in ​​Preferenze condivise

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
 editor.commit(); 

Leggi dalle preferenze condivise

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
long highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);

Usa getSharedPreferences ("MyPref", MODE_PRIVATE); anziché: getPreferences (Context.MODE_PRIVATE); Perché i dati saranno validi solo per l'attività in corso. Questo perché in questa attività il nome del file si trova sul nome dell'attività e quindi se si chiama questa preferenza da un'altra attività i dati saranno diversi.
Guy4444

0
Initialise here..
 SharedPreferences msharedpref = getSharedPreferences("msh",
                    MODE_PRIVATE);
            Editor editor = msharedpref.edit();

store data...
editor.putString("id",uida); //uida is your string to be stored
editor.commit();
finish();


fetch...
SharedPreferences prefs = this.getSharedPreferences("msh", Context.MODE_PRIVATE);
        uida = prefs.getString("id", "");

0
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();

3
Benvenuto in Stack Overflow! Spiegare come utilizzare il codice fornito e perché funziona. Grazie!
creatore

0

Potresti anche dare un'occhiata a un mio progetto di esempio passato , scritto per questo scopo. Salva localmente un nome e lo recupera su richiesta di un utente o all'avvio dell'app.

Ma, in questo momento, sarebbe meglio usare commit(invece di apply) per mantenere i dati. Maggiori informazioni qui .


0
        // Create object of SharedPreferences.
        SharedPreferences sharedPref = getSharedPreferences("mypref", 0);

        //now get Editor
        SharedPreferences.Editor editor = sharedPref.edit();

        //put your value
        editor.putString("name", required_Text);

        //commits your edits
        editor.commit();

       // Its used to retrieve data
       SharedPreferences sharedPref = getSharedPreferences("mypref", 0);
       String name = sharedPref.getString("name", "");

       if (name.equalsIgnoreCase("required_Text")) {
          Log.v("Matched","Required Text Matched");
          } else {
               Log.v("Not Matched","Required Text Not Matched"); 
                 }

0

Le preferenze condivise sono così facili da imparare, quindi dai un'occhiata a questo semplice tutorial su sharedpreference

import android.os.Bundle;
import android.preference.PreferenceActivity;

    public class UserSettingActivity extends PreferenceActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

      addPreferencesFromResource(R.xml.settings);

    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.