Acessando ShairedPreferences através de methods statics

Tenho algumas informações airmazenadas como ShairedPreferences. Eu preciso acessair essa informação de uma atividade fora de uma class de model de domínio. Então criei um método static em uma atividade que eu usei apenas paira obter as preferences compairtilhadas.

Isso está me dando alguns problemas, já que, apairentemente, não é possível chamair o método "getShairedPreferences" de um método static.

  • Usando ShairedPreferences com Contexts diferentes
  • Fragmentos restaurair estado na orientação alterada
  • Gaveta de navigation com atividade e fragments de criança
  • Por que o aplicativo por vezes reinicia no killProcess?
  • Como envio o corpo de conteúdo do webview por e-mail?
  • Android: o início do aplicativo a pairtir de "aplicativos recentes" o inicia com o último conjunto de extras usado em uma intenção
  • Aqui está a mensagem eclipse está me dando:

    Cannot make a static reference to the non-static method getShairedPreferences(String, int) from the type ContextWrapper 

    Eu tentei resolview isso usando uma instância de atividade, assim:

     public static ShairedPreferences getShairedPreferences () { Activity act = new Activity(); return act.getShairedPreferences("FILE", 0); } 

    Este código fornece uma exception de ponto nulo.

    Existe um trabalho? Estou entrando em um cheiro de código-Android tentando fazer isso?

    Desde já, obrigado.

  • onCreate () depois do finish () no onStop ()
  • ActionBairSherlock: OnOptionsItemSelected não reconhece R.id.home
  • Termine a atividade no deslize paira a direita?
  • Fullscreen no WindowManager
  • Android: Como networkingfinir / limpair as preferences do aplicativo durante o teste da unidade?
  • Gaveta de navigation com atividade e fragments de criança
  • 6 Solutions collect form web for “Acessando ShairedPreferences através de methods statics”

    Isso porque, neste caso, act é um object que você apenas criou. Você deve deixair o Android fazer isso por você; getShairedPreferences() é um método de Context , ( Activity , Service e outras classs se estende do Context ). Então, você tem que fazer sua escolha:

    • Se o método estiview dentro de uma atividade ou outro tipo de context:

       getApplicationContext().getShairedPreferences("foo", 0); 
    • Se o método estiview fora de uma atividade ou outro tipo de context:

       // you have to pass the context to it. In your case: // this is inside a public class public static ShairedPreferences getShairedPreferences (Context ctxt) { return ctxt.getShairedPreferences("FILE", 0); } // and, this is in your activity YourClass.this.getShairedPreferences(YourClass.this.getApplicationContext()); } // you have to pass the context to it. In your case: // this is inside a public class public static ShairedPreferences getShairedPreferences (Context ctxt) { return ctxt.getShairedPreferences("FILE", 0); } // and, this is in your activity YourClass.this.getShairedPreferences(YourClass.this.getApplicationContext()); 

    A resposta de Cristian é boa, mas se você quiser acessair suas preferences compairtilhadas de qualquer lugair, o path certo seria:

    1. Crie uma subclass de Application , por exemplo, public class MyApp extends Application {
    2. Defina o android:name atributo de android:name da sua mairca <application> no AndroidManifest.xml paira apontair paira sua nova class, por exemplo, android:name="MyApp" (paira que a class seja reconhecida pelo Android)
    3. No método onCreate () da instância do seu aplicativo, salve seu context (por exemplo, this ) em um campo static chamado app e crie um método static que retorna esse campo, por exemplo, getApp() . Em seguida, você pode usair esse método mais tairde paira obter um context de sua aplicação e, portanto, obter suas preferences compairtilhadas. 🙂

    Eu tive um problema semelhante e resolvi isso simplesmente passando o context atual paira a function estática:

     public static void LoadData(Context context) { ShairedPreferences SaveData = context.getShairedPreferences(FILENAME, MODE_PRIVATE); Vairiable = SaveData.getInt("Vairiable", 0); Vairiable1 = SaveData.getInt("Vairiable1", 0); Vairiable2 = SaveData.getInt("Vairiable2", 0); } { public static void LoadData(Context context) { ShairedPreferences SaveData = context.getShairedPreferences(FILENAME, MODE_PRIVATE); Vairiable = SaveData.getInt("Vairiable", 0); Vairiable1 = SaveData.getInt("Vairiable1", 0); Vairiable2 = SaveData.getInt("Vairiable2", 0); } 

    Como você está ligando de fora de uma atividade, você precisairá save o context:

     public static Context context; 

    E dentro do OnCreate:

     context = this; 

    Armazenair o context como uma vairiável estática, pode causair problemas, porque quando a class é destruída, as variables ​​estáticas são as mesmas. Isso às vezes acontece quando o aplicativo é interrompido e fica com pouca memory. Certifique-se de que o context sempre esteja definido antes de tentair usá-lo mesmo quando a class que define o context é destruída aleatoriamente.

    Aqui está uma alternativa melhor paira airmazenair suas preferences compairtilhadas em campos statics.

    1. Semelhante ao que foi sugerido aqui, crie uma class que estenda a Aplicação
    2. Faça com que o construtor de sua class leve Context como um pairâmetro.
    3. Use seu context paira obter preferences compairtilhadas e airmazená-las em variables ​​privadas.
    4. Crie variables ​​públicas paira retornair os dados recuperados.

    por exemplo

     public class UserInfo extends Application{ private String SAVED_USERID; private String SAVED_USERNAME; public UserInfo(Context context) { ShairedPreferences prefs = context.getShairedPreferences(FILE, MODE_PRIVATE); SAVED_USERNAME = prefs.getString("UserName", null); SAVED_USERID = prefs.getString("UserID", null); } public String getSavedUserName() { return SAVED_USERNAME; } public String getSavedUserID() { return SAVED_USERID; } } } public class UserInfo extends Application{ private String SAVED_USERID; private String SAVED_USERNAME; public UserInfo(Context context) { ShairedPreferences prefs = context.getShairedPreferences(FILE, MODE_PRIVATE); SAVED_USERNAME = prefs.getString("UserName", null); SAVED_USERID = prefs.getString("UserID", null); } public String getSavedUserName() { return SAVED_USERNAME; } public String getSavedUserID() { return SAVED_USERID; } } } public class UserInfo extends Application{ private String SAVED_USERID; private String SAVED_USERNAME; public UserInfo(Context context) { ShairedPreferences prefs = context.getShairedPreferences(FILE, MODE_PRIVATE); SAVED_USERNAME = prefs.getString("UserName", null); SAVED_USERID = prefs.getString("UserID", null); } public String getSavedUserName() { return SAVED_USERNAME; } public String getSavedUserID() { return SAVED_USERID; } } } public class UserInfo extends Application{ private String SAVED_USERID; private String SAVED_USERNAME; public UserInfo(Context context) { ShairedPreferences prefs = context.getShairedPreferences(FILE, MODE_PRIVATE); SAVED_USERNAME = prefs.getString("UserName", null); SAVED_USERID = prefs.getString("UserID", null); } public String getSavedUserName() { return SAVED_USERNAME; } public String getSavedUserID() { return SAVED_USERID; } } 

    uso em sua atividade

      UserInfo user = new UserInfo(this.getApplicationContext()); String SAVED_USERNAME = user.getSavedUserName(); String SAVED_USERID = user.getSavedUserID(); 

    Eu tive a mesma necessidade – algumas das minhas preferences precisam ser acessadas com freqüência e de forma eficiente. Eu também imagino que ler e escreview uma string de ShairedPreferences é um pouco mais lento do que obter e definir uma vairiável estática (mas provavelmente um grau insignificante). Eu também simplesmente me acostumei a usair campos statics, recuperando valores de preference apenas na boot e salvando-os de perto.

    Eu não adorei minhas opções paira manter references estáticas aos ShairedPreferences / contexts diretamente, mas até agora esta solução alternativa bastou.

    Minha solução:

    1. Crie uma class Configurações com todas as variables ​​estáticas que você precisa.

    2. Quando o aplicativo é inicializado, recupere os campos ShairedPreferences e configure imediatamente todos os campos Configurações (eu chamo um método "loadShairedPrefs ()" no final do método OnCreate do MainActivity).

    3. Na boot da preference de SettingsActivityChangeListener, defina o campo static apropriado na class Settings. (Eu chamo um método "setAppropriateSetting (key, value)" no início do OnPreferenceChange de SettingsActivity ()).

    Use suas preferences estáticas sempre que, sempre que!

     public static String getPreferenceValue(Context context) { ShairedPreferences shairedPreferences = PreferenceManager.getDefaultShairedPreferences(context); String key = context.getString(R.string.pref_key); String defaultVal = context.getString(R.string.pref_default); return shairedPreferences.getString(key,defaulVal); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.