Préférences partagées Android pour créer une activité unique (exemple) [fermé]


295

J'ai trois activités A, B et C où A et B sont des formulaires et après avoir rempli et enregistré les données du formulaire dans la base de données (SQLITE). J'utilise l'intention de A à B puis de B à C. Ce que je veux, c'est que chaque fois que j'ouvre mon application, je veux C comme écran d'accueil et non plus A et B.

Je suppose que les préférences partagées fonctionneraient pour cela, mais je ne peux pas trouver un bon exemple pour me donner un point de départ. Toute aide serait appréciée.


10
Utilisation des préférences partagées du site de développement Android.
Onik

1
Avez-vous consulté le didacticiel officiel sur developer.android.com/guide/topics/data/data-storage.html#pref ?
AxiomaticNexus

12
Je vote pour rouvrir cette question car elle ne demande pas vraiment de recommandation.
Suragch

Réponses:


620

Définition des valeurs dans Préférence:

// 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();

Récupérez les données de préférence:

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.

Plus d'informations:

Utilisation des préférences partagées

Préférences partagées


74
Envisagez plutôt d'utiliser apply (); commit écrit immédiatement ses données dans un stockage persistant, tandis qu'applique les gère en arrière-plan.
CodeNinja

12
apply()est un appel asynchrone pour effectuer des E / S disque où as commit()est synchrone. Évitez donc d'appeler à commit()partir du thread d'interface utilisateur.
Aniket Thakur

103

Créer des préférences partagées

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

Stockage des données sous forme de paire 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

Obtenez les données SharedPreferences

// Si la valeur de la clé n'existe pas, retournez la deuxième valeur param - Dans ce cas, 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

Suppression de la valeur de clé de 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

Effacer toutes les données de SharedPreferences

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

3
pref.getBoolean ("nom_clé1", null); il ne peut pas être nul. Il a besoin d'une valeur par défaut s'il n'y a rien de stocké.
Boris Karloff

2
Vous feriez mieux d'utiliser apply () au lieu de commit (). apply () est asynchrone et vous l'exécuterez sur un thread d'arrière-plan
Androider

Crashera si key_name3 ou key_name4 sont nuls
TacB0sS

1
J'ai une page d'inscription qui stocke les informations de l'utilisateur et j'ai une page de connexion que l'utilisateur se connecte avec ces informations. J'ai deux classes, je prends des informations dans une classe et je veux utiliser ces informations dans une autre classe. Lorsque j'utilise le code ci-dessus dans mon code. Je prends l'exception de pointeur nul. Y a-t-il une utilisation comme moi? @ KrauszLórántSzilveszter
ZpCikTi

43

Comment intialiser?

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

Editor editor = pref.edit();

Comment stocker des données dans une préférence partagée?

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

OU

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

Et n'oubliez pas de postuler:

editor.apply();

Comment récupérer des données à partir des préférences partagées?

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

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

J'espère que cela vous aidera U :)


L'initialisation est importante si vous accédez à une activité, un fragment ou une classe publique
DragonFire

19

Vous pouvez créer votre classe SharedPreference personnalisée

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 "";         
    }
}

Vous pouvez obtenir l'instance de YourPrefrence comme:

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

String value = yourPreference.getData(YOUR_KEY);

1
Valeur de chaîne = yourPreference.getData (YOUR_KEY); Erreur: le contenu non statique ne peut pas être référencé dans un contexte statique
Jana Babu

salut instance de Context me donnait null donc j'ai mis sharedPreferences = context.getSharedPreferences ("YourCustomNamedPreference", Context.MODE_PRIVATE); cette ligne dans try catch block et son travail mais le truc c'est que ça donne null?
Ionic

J'utilise cette classe dans mon projet et initie mes préférences partagées dans BaseActivity, et j'utilise dans d'autres activités (écran de démarrage et connexion et activité principale) pour vérifier l'état de connexion de l'utilisateur et quitter l'application. Mais cela ne fonctionne pas pour Android 8 pour la sortie! Avez-vous des suggestions?
roghayeh hosseini

17

Je viens de trouver tous les exemples ci-dessus trop confus, alors j'ai écrit le mien. Les fragments de code sont parfaits si vous savez ce que vous faites, mais qu'en est-il des gens comme moi qui ne le savent pas?

Vous préférez une solution couper-coller? Et bien voilà!

Créez un nouveau fichier java et appelez-le Keystore. Collez ensuite ce code:

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();
}
}

Maintenant, enregistrez ce fichier et oubliez-le. Vous en avez terminé. Maintenant, revenez à votre activité et utilisez-la comme ceci:

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);
    }
}

J'utilise cette classe dans mon projet et initie mes préférences partagées dans BaseActivity, et j'utilise dans d'autres activités (écran de démarrage et connexion et activité principale) pour vérifier l'état de connexion de l'utilisateur et quitter l'application. Mais cela ne fonctionne pas pour Android 8 pour la sortie! Avez-vous des suggestions?
roghayeh hosseini

15

Shared Preferencessont des fichiers XML pour stocker des données primitives privées dans des paires clé-valeur. Les types de données incluent les booléens , les flottants , les entiers , les longs et les chaînes .

Lorsque nous voulons enregistrer des données accessibles dans toute l'application, une façon de le faire est de les enregistrer dans une variable globale. Mais il disparaîtra une fois l'application fermée. Une autre façon recommandée est d'enregistrer SharedPreference. Les données enregistrées dans le fichier SharedPreferences sont accessibles dans toute l'application et persistent même après la fermeture de l'application ou lors des redémarrages.

SharedPreferences enregistre les données par paire clé-valeur et est accessible de la même manière.

Vous pouvez créer un objet en SharedPreferencesutilisant deux méthodes,

1). getSharedPreferences () : En utilisant ces méthodes, vous pouvez créer plusieurs SharedPreferences.et ses premiers paramètres au nom de SharedPreferences.

2). getPreferences () : En utilisant cette méthode, vous pouvez créer Single SharedPreferences.

Stocker des données

Ajouter une déclaration de variable / créer un fichier de préférences

public static final String PREFERENCES_FILE_NAME = "MyAppPreferences";

Récupérer un handle vers le nom de fichier (en utilisant getSharedPreferences)

SharedPreferences settingsfile= getSharedPreferences(PREFERENCES_FILE_NAME,0);

Ouvrir l'éditeur et ajouter des paires clé-valeur

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(); 

N'oubliez pas d'appliquer / enregistrer en utilisant myeditor.apply()comme indiqué ci-dessus.

Récupération des données

 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();
}

}

**** Utilisez les préférences pour écrire la valeur en utilisant: - ****

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

**** Utilisez les préférences pour lire la valeur en utilisant: - ****

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

7

Le meilleur moyen de créer SharedPreferenceet pour une utilisation globale, vous devez créer une classe comme ci-dessous:

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 est déconseillé
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

Écrire dans les préférences partagées

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

Lire à partir des préférences partagées

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

Utilisez getSharedPreferences ("MyPref", MODE_PRIVATE); au lieu de: getPreferences (Context.MODE_PRIVATE); Parce que les données ne seront valables que pour l'activité sur laquelle vous vous trouvez. En effet, dans cette activité, le nom de fichier est sur le nom de l'activité et donc si vous appelez ces préférences d'une autre activité, les données seront différentes.
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
Bienvenue dans Stack Overflow! Veuillez expliquer comment utiliser le code que vous avez fourni et pourquoi il fonctionne. Merci!
intcreator

0

Vous pouvez également jeter un coup d'œil à un exemple de projet précédent , écrit à cet effet. J'enregistre localement un nom et le récupère à la demande d'un utilisateur ou au démarrage de l'application.

Mais, pour le moment, il serait préférable d'utiliser commit(au lieu de apply) pour conserver les données. Plus d'infos ici .


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

Les préférences partagées sont si faciles à apprendre, alors jetez un œil à ce didacticiel simple sur les préférences partagées

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

    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.