Como obtenho as SharedPreferences de uma PreferenceActivity no Android?

373

Estou usando um PreferenceActivity para mostrar algumas configurações para o meu aplicativo. Estou inflando as configurações por meio de um arquivo xml para que meus onCreate (e métodos de classe completos) sejam assim:

public class FooActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        addPreferencesFromResource(R.xml.preference);
    }
}

O javadoc de PreferenceActivity PreferenceFragment afirma que

Essas preferências serão salvas automaticamente em SharedPreferences à medida que o usuário interage com elas. Para recuperar uma instância de SharedPreferences que a hierarquia de preferências nesta atividade usará, chame getDefaultSharedPreferences (android.content.Context) com um contexto no mesmo pacote que esta atividade.

Mas como obtenho o nome da SharedPreference em outra atividade? Eu só posso ligar

getSharedPreferences(name, mode)

na outra atividade, mas preciso do nome do SharedPreference que foi usado pelo PreferenceActivity. Qual é o nome ou como posso recuperá-lo?

Dave
fonte

Respostas:

721
import android.preference.PreferenceManager;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// then you use
prefs.getBoolean("keystring", true);

Atualizar

De acordo com preferências compartilhadas | Tutorial do desenvolvedor do Android (parte 13) de Sai Geetha MN,

Muitos aplicativos podem fornecer uma maneira de capturar as preferências do usuário nas configurações de um aplicativo ou atividade específica. Para apoiar isso, o Android fornece um conjunto simples de APIs.

As preferências geralmente são pares de valores de nomes. Eles podem ser armazenados como "Preferências Compartilhadas" em várias atividades em um aplicativo (observe que atualmente não pode ser compartilhado entre processos). Ou pode ser algo que precisa ser armazenado específico para uma atividade.

  1. Preferências compartilhadas: As preferências compartilhadas podem ser usadas por todos os componentes (atividades, serviços etc.) dos aplicativos.

  2. Preferências de atividade manipulada: essas preferências podem ser usadas apenas dentro da atividade específica e não podem ser usadas por outros componentes do aplicativo.

Preferências Compartilhadas:

As preferências compartilhadas são gerenciadas com a ajuda do getSharedPreferencesmétodo da Contextclasse. As preferências são armazenadas em um arquivo padrão (1) ou você pode especificar um nome de arquivo (2) para ser usado para se referir às preferências.

(1) A maneira recomendada é usar o modo padrão, sem especificar o nome do arquivo

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(2) Aqui está como você obtém a instância ao especificar o nome do arquivo

public static final String PREF_FILE_NAME = "PrefFile";
SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);

MODE_PRIVATEé o modo operacional para as preferências. É o modo padrão e significa que o arquivo criado será acessado apenas pelo aplicativo de chamada. Outros dois modos suportados são MODE_WORLD_READABLEe MODE_WORLD_WRITEABLE. Em MODE_WORLD_READABLEoutro aplicativo, pode ler o arquivo criado, mas não pode modificá-lo. No caso de MODE_WORLD_WRITEABLEoutros aplicativos, também há permissões de gravação para o arquivo criado.

Por fim, depois de ter a instância de preferências, eis como você pode recuperar os valores armazenados das preferências:

int storedPreference = preferences.getInt("storedInt", 0);

Para armazenar valores no arquivo de preferência, o SharedPreference.Editorobjeto deve ser usado. Editoré uma interface aninhada na SharedPreferenceclasse

SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

O Editor também suporta métodos como remove()e clear()para excluir os valores de preferência do arquivo.

Preferências da atividade:

As preferências compartilhadas podem ser usadas por outros componentes do aplicativo. Mas se você não precisar compartilhar as preferências com outros componentes e desejar ter preferências particulares da atividade, poderá fazê-lo com a ajuda do getPreferences()método da atividade. O getPreferencemétodo usa o getSharedPreferences()método com o nome da classe de atividade para o nome do arquivo de preferência.

A seguir está o código para obter preferências

SharedPreferences preferences = getPreferences(MODE_PRIVATE);
int storedPreference = preferences.getInt("storedInt", 0);

O código para armazenar valores também é o mesmo que no caso de preferências compartilhadas.

SharedPreferences preferences = getPreference(MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

Você também pode usar outros métodos, como armazenar o estado da atividade no banco de dados. Nota O Android também contém um pacote chamado android.preference. O pacote define classes para implementar a interface do usuário de preferências do aplicativo.

Para ver mais alguns exemplos, verifique a publicação de armazenamento de dados do Android no site dos desenvolvedores.

Pentium10
fonte
55
+1: u salvou meu dia .. nenhum dos tutoriais / exemplos na Internet fala sobre isso. todos falam sobre recursos e personalizações, mas não como lê-los.
Ankitjaininfo 10/09/10
11
Veja minha atualização da resposta e o nome do arquivo é algo como, package.prefsmas não tenho certeza.
usar o seguinte comando
11
Obrigado pelo código. Há apenas uma coisinha que está me confundindo: SharedPreference é uma interface, então onde está o código real implementado que lida com qualquer chamada de método?
precisa saber é o seguinte
11
Gostaria de ter lido isso uma semana antes de desperdiçar meu tempo lendo algumas respostas / comentários estúpidos de nerds em todo o SE, que pensam que sabem quando realmente não o fazem .. Obrigado @ Pentium10, você possui algum blog, obrigado novamente? :)
Sanjeevcn
11
Em vez de usar editor.commit (), você também pode usar editor.apply (). A diferença é que o commit () grava suas alterações de forma síncrona e aplica as grava de forma assíncrona. Isso torna sua interface do usuário mais rápida.
Hashim Akhtar
29

Se você não tem acesso getDefaultSharedPreferenes(), pode usar getSharedPreferences(name, mode), basta passar o nome certo.

O Android cria esse nome (possivelmente com base no nome do pacote do seu projeto?). Você pode obtê-lo colocando o seguinte código em a SettingsActivity onCreate()e vendo o que preferencesNameé.

String preferencesName = this.getPreferenceManager().getSharedPreferencesName();

A string deve ser algo parecido com.example.projectname_preferences. Codifique isso em algum lugar do seu projeto e passe-o para getSharedPreferences()e você deve estar pronto.

Green Oak Software
fonte
11
A origem da atividade é: public SharedPreferences getPreferences (modo int) {retorne getSharedPreferences (getLocalClassName (), mode); }
Tatarize
22

Declare esses métodos primeiro.

public static void putPref(String key, String value, Context context) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.commit();
}

public static String getPref(String key, Context context) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(key, null);
}

Em seguida, chame isso quando quiser colocar um pref:

putPref("myKey", "mystring", getApplicationContext());

chame isso quando quiser obter um pref:

getPref("myKey", getApplicationContext());

Ou você pode usar este objeto https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo, que simplifica tudo ainda mais

Exemplo:

TinyDB tinydb = new TinyDB(context);

tinydb.putInt("clickCount", 2);
tinydb.putFloat("xPoint", 3.6f);
tinydb.putLong("userCount", 39832L);

tinydb.putString("userName", "john");
tinydb.putBoolean("isUserMale", true); 

tinydb.putList("MyUsers", mUsersArray);
tinydb.putImagePNG("DropBox/WorkImages", "MeAtlunch.png", lunchBitmap);
kc ochibili
fonte
Por que não usar editor.apply (); em vez de cometer para o processamento em segundo plano
Avi Parshan
4

ter que passar o contexto por toda parte é realmente me irritar. o código se torna muito detalhado e incontrolável. Eu faço isso em todos os projetos ...

public class global {
    public static Activity globalContext = null;

e configurá-lo na atividade principal criar

@Override
public void onCreate(Bundle savedInstanceState) {
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
            global.sdcardPath,
            ""));
    super.onCreate(savedInstanceState);

    //Start 
    //Debug.startMethodTracing("appname.Trace1");

    global.globalContext = this;

Além disso, todas as teclas de preferências devem ser independentes do idioma. Estou chocado que ninguém tenha mencionado isso.

getText(R.string.yourPrefKeyName).toString()

agora chame isso de forma muito simples assim em uma linha de código

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true);
hamish
fonte
4
Qual é a vantagem de tornar o idioma das chaves independente? Eles nunca são mostrados ao usuário, certo?
Gerd
11
Por favor, pelo amor de Deus, nunca use uma Atividade como um Contexto global. Se você precisar usar um contexto global, faça isso usando uma classe Application personalizada.
Thorben
11
@Thorben concordou. Ou simplesmentegetApplicationContext()
OneCricketeer 3/16/16
3

se você tem uma caixa de seleção e gostaria de buscar seu valor, isto é, true / false em qualquer arquivo java -

Usar--

Context mContext;
boolean checkFlag;

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);`
UrviG
fonte
0

Atualizado 2019

Você pode simplesmente usar a PowerPreferencebiblioteca

https://github.com/AliEsaAssadi/Android-Power-Preference

Obtendo instância de preferência compartilhada

Para obter a instância padrão, basta chamar

PowerPreference.getDefaultFile()

Ou se você deseja um arquivo de preferências específico

PowerPreference.getFileByName(fileName)

Gravando dados:

PowerPreference.getDefaultFile().put(key,value)

Obtendo dados

PowerPreference.getDefaultFile().getString(key,value)
Ali Asadi
fonte
Como o PowerPreference lida com a parte do contexto? É necessário um contexto para ler as preferências compartilhadas, não? Eu sou novo no Android e estou tentando entender.
Yeti
0

Tente seguir o código-fonte que funcionou para mim

//Fetching id from shared preferences
    SharedPreferences sharedPreferences;
    sharedPreferences =getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    getUserLogin = sharedPreferences.getString(Constant.ID_SHARED_PREF, "");
Istiak
fonte