2012-07-19 24 views
11

¿Hay alguna manera de hacer SharedPreferences global en toda mi aplicación? En este momento estoy usando estas líneas en muchos lugares a lo largo de mi código para almacenar configuraciones sencillas de encendido/apagado para una serie de preferencias que pueden configurar mis usuarios. Sólo quiero llamar una vez a nivel mundial, si es posible:¿Hay alguna forma de hacer SharedPreferences global en toda mi aplicación de Android?

SharedPreferences settings = getSharedPreferences("prefs", 0); 
SharedPreferences.Editor editor = settings.edit(); 

Algún consejo sobre cómo ser capaz de llamar simplemente estas líneas en todas las clases sería impresionante:

editor.putString("examplesetting", "off"); 
editor.commit(); 

y

String checkedSetting = settings.getString("examplesetting", ""); 
+0

Ver mi respuesta. Funciona –

Respuesta

14

Lo sé, lo sé, me inflamaré, y caeré en las brasas del infierno ....

Use a sing leton clase que se envuelve alrededor de la configuración SharedPreference .. algo como esto:

public class PrefSingleton{ 
    private static PrefSingleton mInstance; 
    private Context mContext; 
    // 
    private SharedPreferences mMyPreferences; 

    private PrefSingleton(){ } 

    public static PrefSingleton getInstance(){ 
     if (mInstance == null) mInstance = new PrefSingleton(); 
     return mInstance; 
    } 

    public void Initialize(Context ctxt){ 
     mContext = ctxt; 
     // 
     mMyPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); 
    } 
} 

Y crear funciones de contenedor de todo lo que sus ejemplos representados en la cuestión, por ejemplo,

PrefSingleton.getInstance().writePreference("exampleSetting", "off");

y la implementación podría sea ​​algo como esto:

// Within Singleton class 

public void writePreference(String key, String value){ 
    Editor e = mMyPreference.edit(); 
    e.putString(key, value); 
    e.commit(); 
} 

Desde su primera actividad, active la clase singleton, de esta manera, algo como esto:

PrefSingleton.getInstance().Initialize(getApplicationContext()); 

La razón corro el riesgo de abajo-voto, es decir, utilizando clases estáticas global puede ser una mala idea y va en contra de la práctica de fundamentos de programación. PERO habiendo dicho que, aparte de ser quisquilloso, asegurará que solo el único objeto de la clase PrefSingleton pueda existir y sea accesible independientemente de las actividades en las que se encuentre el código.

+2

¿Las preferencias funcionan con el contexto de la aplicación? Muchas cosas no, por lo que su uso siempre es complicado. Además, la "primera actividad" está un poco indefinida, ya que la aplicación se puede iniciar desde una transmisión, intención pendiente (widget, etc.). –

+0

@NikolayElenkov Seguro, estoy de acuerdo con usted, recuerde, le puse un ejemplo genérico que estaba en lo alto de mi cabeza ... podría ser modificado para satisfacer sus necesidades. :) – t0mm13b

+2

Si extiende la aplicación, ¿no podría inicializar su singleton en su subclase y evitar el problema de "primera actividad"? – qix

9

Extendería Application e incluiría el SharedPreferences.Editor como campo con un getter.

public class APP extends Application { 
    private final SharedPreferences settings = getSharedPreferences("prefs", 0); 
    private final SharedPreferences.Editor editor = settings.edit(); 

    public SharedPreferences.Editor editSharePrefs() { 
     return editor; 
    } 
} 

A continuación, puede acceder a él desde cualquier Activity con

((APP) getApplication()).editSharePrefs().putString("examplesetting", "off"); 
((APP) getApplication()).editsharePrefs().commit(); 

Como alternativa, también se puede lanzar en el método

public static APP getAPP(Context context) { 
     return (APP) context.getApplicationContext(); 
    } 

Aunque, esto simplemente cambiar las llamadas que realice a

APP.getAPP(this).editSharePrefs().putString("examplesetting", "off"); 
APP.getAPP(this).editsharePrefs().commit(); 

Entonces, realmente es una preferencia personal, que se ve más limpio para usted.

+4

Mientras esto funciona, usar una clase de aplicación para esto es exagerado. Sin mencionar que tendrás que lanzarlo a tu clase concreta todo el tiempo. Una clase de ayuda simple con métodos estáticos que toman un parámetro 'Context' (puedes pasar' this' cuando estás en una actividad) es mucho mejor. La aplicación realmente no le compra nada en este caso. –

0

Utilice una clase de Ayuda para obtener todo lo que desee, haga que los métodos sean estáticos. Así es como lo hace ADW.

2

Me gustaría hacer esto siguiente:

public class BaseActivity extends Activity { 

     protected boolean setInHistory; 
     protected SharedPreferences sharedPrefs; 

      @Override 
     protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); 
    setInHistory = true; 
     } 


} 


public class MainActivity extends BaseActivity { 

     public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 

       System.out.println(setInHistory+" <-- setInhistory"); 

      } 
} 

A continuación, puede acceder sharedPrefs porque está protegido entonces es accesible a través del paquete.

In the console you have : true <-- setInhistory 
+0

Esta es mi solución favorita. – Ish

+0

Creo que esto solo funcionaría si tienes todas tus actividades extendiendo BaseActivity. ¿Qué sucede si tiene Fragments o ViewPagerAdapters que necesita para almacenar variables? – Simon

+0

@Simon ¿puedes simplemente lanzar tu getActivity? ex, '((MainActivity) getActivity) getSharedPref();'? ¿Qué hay sobre eso? –

-1

Uso esto para establecer el ajuste:

public static void SetCheckedSetting(Context context, String value) 
{ 
    SharedPreferences settings = getSharedPreferences("prefs", 0); 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putString("examplesetting", value); 
    editor.commit(); 
} 

Y esto para conseguir el ajuste:

public static String GetCheckedSetting(Context context) 
{ 
    SharedPreferences settings = getSharedPreferences("prefs", 0); 
    return settings.getString("examplesetting", ""); 
} 

Para pasar el contexto puede simplemente usar this palabra clave.

Es importante que haga no tienda SharedPreferences como una variable estática. Si lo haces, provoca una pérdida de memoria. Ver: http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html

Cuestiones relacionadas