Preferências compartilhadas do Android para criar uma atividade única (exemplo) [fechada]


295

Eu tenho três atividades A, B e C, onde A e B são formulários e depois de preencher e salvar os dados do formulário no banco de dados (SQLITE). Estou usando a intenção de A para B e depois de B para C. O que eu quero é que toda vez que abro meu aplicativo, eu quero C como minha tela inicial e não mais A e B.

Acho que as preferências compartilhadas funcionariam para isso, mas não consigo encontrar um bom exemplo para me dar um ponto de partida. Qualquer ajuda seria apreciada.


10
Usando Preferências Compartilhadas no site de desenvolvimento Android.
Onik


12
Estou votando para reabrir esta pergunta porque não está realmente pedindo uma recomendação.
Suragch

Respostas:


620

Configurando valores em Preferência:

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

Recupere dados de preferência:

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.

mais informações:

Usando preferências compartilhadas

Preferências Compartilhadas


74
Considere usar apply (); commit grava seus dados no armazenamento persistente imediatamente, enquanto o apply o manipula em segundo plano.
CodeNinja

12
apply()é uma chamada assíncrona para executar E / S de disco onde commit()está síncrona. Portanto, evite ligar commit()do thread da interface do usuário.
Aniket Thakur

103

Criar SharedPreferences

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

Armazenando dados como par de 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

Obter dados SharedPreferences

// Se o valor da chave não existir, retorne o segundo valor do parâmetro - neste 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

Excluindo o valor da chave 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

Limpar todos os dados de SharedPreferences

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

3
pref.getBoolean ("key_name1", nulo); não pode ser nulo. Ele precisa de um valor padrão, se não houver nada armazenado.
Boris Karloff

2
É melhor usar apply () em vez de commit (). aplicar () é assíncrono e você vai executá-lo em uma discussão de fundo
Androider

Travará se key_name3 ou key_name4 forem nulos
TacB0sS 14/17/17

1
Eu tenho uma página de registro que armazena informações do usuário e uma página de logon em que o usuário entra com essas informações. Eu tenho duas classes, eu tomo informações uma classe e quero usar essas informações em outra classe. Quando eu uso o código acima no meu código. Recebo uma exceção de ponteiro nulo. Existe um uso como eu? @ KrauszLórántSzilveszter
ZpCikTi

43

Como inicializar?

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

Editor editor = pref.edit();

Como armazenar dados em preferência compartilhada?

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

OU

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

E não se esqueça de aplicar:

editor.apply();

Como recuperar dados de preferências compartilhadas?

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

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

Espero que isso ajude U :)


A inicialização é importante se você acessando em uma atividade, fragmento ou classe pública
DragonFire

19

Você pode criar sua classe SharedPreference personalizada

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

Você pode obter a instância YourPrefrence como:

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

String value = yourPreference.getData(YOUR_KEY);

1
Valor da sequência = yourPreference.getData (YOUR_KEY); Erro: conteúdo não estático canot ser referida em contexto estático
Jana Babu

oi instância do Context estava me dando null, então eu coloquei sharedPreferences = context.getSharedPreferences ("YourCustomNamedPreference", Context.MODE_PRIVATE); esta linha em try catch block e seu trabalho, mas a coisa é por isso que está dando null?
Ionic

Uso essa classe em meu projeto e inicio minhas preferências compartilhadas em BaseActivity, e uso em outras atividades (splashScreen e login e atividade principal) para verificar o estado de login do usuário e sair do aplicativo. Mas isso não funciona para o Android 8 para sair! Você tem alguma sugestão?
hosseini roghayeh

17

Acabei de achar todos os exemplos acima muito confusos, então escrevi os meus. Fragmentos de código são bons se você sabe o que está fazendo, mas e as pessoas como eu que não sabem?

Deseja uma solução de cortar e colar? Bem, aqui está!

Crie um novo arquivo java e chame-o de Keystore. Em seguida, cole neste 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();
}
}

Agora salve esse arquivo e esqueça. Você terminou com isso. Agora volte à sua atividade e use-a assim:

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 essa classe em meu projeto e inicio minhas preferências compartilhadas em BaseActivity, e uso em outras atividades (splashScreen e login e atividade principal) para verificar o estado de login do usuário e sair do aplicativo. Mas isso não funciona para o Android 8 para sair! Você tem alguma sugestão?
hosseini roghayeh

15

Shared Preferencessão arquivos XML para armazenar dados primitivos privados em pares de valor-chave. Os tipos de dados incluem booleanos , flutuadores , ints , longs e strings .

Quando queremos salvar alguns dados acessíveis em todo o aplicativo, uma maneira de fazer isso é salvá-los na variável global. Mas ele desaparecerá assim que o aplicativo for fechado. Outra maneira recomendada é economizar emSharedPreference . Os dados salvos no arquivo SharedPreferences são acessíveis em todo o aplicativo e persistem mesmo depois que o aplicativo é fechado ou durante as reinicializações.

SharedPreferences salva os dados no par de chave-valor e pode ser acessado da mesma maneira.

Você pode criar um objeto SharedPreferencesusando dois métodos,

1) getSharedPreferences () : usando esses métodos, você pode criar Multiple SharedPreferences.and seus primeiros parâmetros em nome de SharedPreferences.

2) getPreferences () : usando esse método, você pode criar Single SharedPreferences.

Armazenando Dados

Adicionar uma declaração variável / Criar arquivo de preferência

public static final String PREFERENCES_FILE_NAME = "MyAppPreferences";

Recuperar um identificador para o nome do arquivo (usando getSharedPreferences)

SharedPreferences settingsfile= getSharedPreferences(PREFERENCES_FILE_NAME,0);

Abra o Editor e adicione pares de valores-chave

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ão se esqueça de aplicar / salvar usando myeditor.apply()como mostrado acima.

Recuperando dados

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

}

**** Use Preferências para escrever valor usando: - ****

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

**** Use Preferências para ler o valor usando: - ****

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

7

Melhor maneira de criar SharedPreferencee para uso global, você precisa criar uma classe como abaixo:

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

}

O PreferenceManager.getDefaultSharedPreferences está obsoleto.
Guy4444 25/11/19

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

Gravar em preferências compartilhadas

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

Ler em Preferências Compartilhadas

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

Use getSharedPreferences ("MyPref", MODE_PRIVATE); em vez de: getPreferences (Context.MODE_PRIVATE); Porque os dados serão válidos apenas para a atividade em que você está. Isso ocorre porque nesta atividade o nome do arquivo está no nome da atividade e, portanto, se você acessar essas preferências de outra atividade, os dados serão 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", "");

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
Bem-vindo ao Stack Overflow! Por favor, explique como usar o código que você forneceu e por que ele funciona. Obrigado!
Intcreator # 16/15

0

Você também pode dar uma olhada em um projeto de amostra anterior , escrito para esse fim. Salvar localmente um nome e recuperá-lo mediante solicitação do usuário ou quando o aplicativo for iniciado.

Mas, neste momento, seria melhor usar commit(em vez de apply) para persistir os dados. Mais informações aqui .


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

Preferências compartilhadas é tão fácil de aprender, então dê uma olhada neste tutorial simples sobre preferência compartilhada

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

    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.