Preferencias compartidas de Android para crear una actividad única (ejemplo) [cerrado]

295

Tengo tres actividades A, B y C donde A y B son formularios y después de llenar y guardar los datos del formulario en la base de datos (SQLITE). Estoy usando la intención de A a B y luego de B a C. Lo que quiero es que cada vez que abro mi aplicación quiero C como pantalla de inicio y ya no A y B.

Supongo que las preferencias compartidas funcionarían para esto, pero no puedo encontrar un buen ejemplo para darme un punto de partida. Cualquier ayuda sería apreciada.

usuario3104719
fuente
10
Uso de preferencias compartidas del sitio de desarrollo de Android.
Onik
1
¿Viste el tutorial oficial en developer.android.com/guide/topics/data/data-storage.html#pref ?
AxiomaticNexus
12
Estoy votando para reabrir esta pregunta porque realmente no está pidiendo una recomendación.
Suragch

Respuestas:

620

Establecer valores en Preferencia:

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

Recuperar datos de preferencia:

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.

más información:

Usar preferencias compartidas

Preferencias compartidas

Jorgesys
fuente
74
Considere usar apply () en su lugar; commit escribe sus datos en el almacenamiento persistente de inmediato, mientras que apply lo manejará en segundo plano.
CodeNinja
12
apply()es una llamada asincrónica para realizar E / S de disco donde como commit()es sincrónico. Así que evite llamar commit()desde el hilo de la interfaz de usuario.
Aniket Thakur
103

Crear preferencias compartidas

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

Almacenar datos como par CLAVE / VALOR

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

Obtener datos de preferencias compartidas

// Si el valor de la clave no existe, devuelve el segundo valor de parámetro: en este caso, nulo

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

Eliminar valor clave 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

Borrar todos los datos de SharedPreferences

 editor.clear();
 editor.apply(); // commit changes
Krausz Lóránt Szilveszter
fuente
3
pref.getBoolean ("key_name1", nulo); No puede ser nulo. Necesita un valor de defalut si no hay nada almacenado.
Boris Karloff
2
Será mejor que use apply () en lugar de commit (). apply () es asíncrono y lo ejecutará en un hilo de fondo
Androider
Se bloqueará si key_name3 o key_name4 son nulos
TacB0sS
1
Tengo una página de registro que almacena la información del usuario y tengo una página de inicio de sesión en la que el usuario inicia sesión con esa información. Tengo dos clases, tomo información de una clase y quiero usar esa información de otra clase. Cuando uso el código anterior en mi código. Tomo una excepción de puntero nulo. ¿Hay algún uso como yo? @ KrauszLórántSzilveszter
ZpCikTi
43

¿Cómo incializar?

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

Editor editor = pref.edit();

¿Cómo almacenar datos en preferencias compartidas?

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

O

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

Y no olvides aplicar:

editor.apply();

¿Cómo recuperar datos de preferencias compartidas?

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

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

Espero que esto te ayude :)

Omi Sparky
fuente
La inicialización es importante si accede a una actividad, fragmento o clase pública
DragonFire
19

Puede crear su clase personalizada SharedPreference

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

Puede obtener su instancia de YourPrefrence como:

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

String value = yourPreference.getData(YOUR_KEY);
Rahul Parihar
fuente
1
Valor de cadena = yourPreference.getData (YOUR_KEY); Error: el contenido no estático no se puede consultar en contexto estático
Jana Babu
hola instancia de Context me estaba dando nulo, así que puse sharedPreferences = context.getSharedPreferences ("YourCustomNamedPreference", Context.MODE_PRIVATE); esta línea en try catch block y su trabajo, pero la cosa es que ¿por qué da nulo?
Ionic
Uso esta clase en mi proyecto e inicio mis preferencias compartidas en BaseActivity, y lo uso en otras actividades (splashScreen & login & main activity) para verificar el estado de inicio de sesión del usuario y salir de la aplicación. ¡Pero esto no funciona para Android 8 para salir! ¿Tienes alguna sugerencia?
roghayeh hosseini
17

Acabo de encontrar todos los ejemplos anteriores demasiado confusos, así que escribí el mío. Los fragmentos de código están bien si sabes lo que estás haciendo, pero ¿qué pasa con las personas como yo que no?

¿Quieres una solución de cortar y pegar en su lugar? Pues aquí está!

Cree un nuevo archivo java y llámelo Keystore. Luego pegue este código:

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

Ahora guarda ese archivo y olvídalo. Ya terminaste con eso. Ahora regrese a su actividad y úsela así:

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);
    }
}
RM
fuente
Uso esta clase en mi proyecto e inicio mis preferencias compartidas en BaseActivity, y lo uso en otras actividades (splashScreen & login & main activity) para verificar el estado de inicio de sesión del usuario y salir de la aplicación. ¡Pero esto no funciona para Android 8 para salir! ¿Tienes alguna sugerencia?
roghayeh hosseini
15

Shared Preferencesson archivos XML para almacenar datos primitivos privados en pares clave-valor. Los tipos de datos incluyen booleanos , flotantes , entrantes , largos y cadenas .

Cuando deseamos guardar algunos datos accesibles a través de la aplicación, una forma de hacerlo es guardarlos en una variable global. Pero desaparecerá una vez que se cierre la aplicación. Otra forma recomendada es ahorrar SharedPreference. Se puede acceder a los datos guardados en el archivo SharedPreferences en toda la aplicación y persisten incluso después de que la aplicación se cierra o se reinicia.

SharedPreferences guarda los datos en pares clave-valor y se puede acceder de la misma manera.

Puedes crear objetos SharedPreferencesusando dos métodos,

1) getSharedPreferences () : con este método puede crear Multiple SharedPreferences. y sus primeros parámetros en nombre de SharedPreferences.

2) getPreferences () : con este método puede crear Single SharedPreferences.

Almacenamiento de datos

Agregar una declaración de variables / Crear archivo de preferencias

public static final String PREFERENCES_FILE_NAME = "MyAppPreferences";

Recupere un identificador para el nombre de archivo (usando getSharedPreferences)

SharedPreferences settingsfile= getSharedPreferences(PREFERENCES_FILE_NAME,0);

Abrir Editor y Agregar pares clave-valor

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

No olvides aplicar / guardar usando myeditor.apply() como se muestra arriba.

Recuperando datos

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

}

**** Use Preferencias para escribir valor usando: - ****

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

**** Use Preferencias para leer el valor usando: - ****

Preferences.readString(getApplicationContext(), Preferences.NAME,
                    "");
smit modi
fuente
7

La mejor manera de crear SharedPreferencey para uso global necesita crear una clase como la siguiente:

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

}
varotariya vajsi
fuente
PreferenceManager.getDefaultSharedPreferences está en desuso
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;
}
CHirag RAmi
fuente
3

Escribir en preferencias compartidas

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

Leer desde preferencias compartidas

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);
Syed Junaid
fuente
Utilice getSharedPreferences ("MyPref", MODE_PRIVATE); en lugar de: getPreferences (Context.MODE_PRIVATE); Porque los datos solo serán válidos para la actividad en la que se encuentre. Esto se debe a que en esta actividad el nombre del archivo está en el nombre de la actividad y, por lo tanto, si llama a estas preferencias desde otra actividad, los datos serán diferentes.
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", "");
shweta c
fuente
0
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();
Syed Junaid
fuente
3
¡Bienvenido a Stack Overflow! Explique cómo usar el código que proporcionó y por qué funciona. ¡Gracias!
intcreator
0

También podría echar un vistazo a un proyecto de muestra anterior mío, escrito para este propósito. Guardo localmente un nombre y lo recupera a pedido del usuario o cuando se inicia la aplicación.

Pero, en este momento, sería mejor usar commit(en lugar de apply) para conservar los datos. Más información aquí .

Thodorisbais
fuente
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"); 
                 }
Nadeem Abbas
fuente
0

Las preferencias compartidas son muy fáciles de aprender, así que eche un vistazo a este sencillo tutorial sobre preferencias compartidas

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

    }
}
dondondon
fuente