¿Hay alguna manera de hacer que SharedPreferences sea global en toda mi aplicación para Android?
¿Hay alguna manera de hacer que SharedPreferences sea global en toda mi aplicación? Ahora mismo estoy usando estas líneas en muchos lugares a lo largo de mi código para almacenar ajustes de encendido / apagado simples para una serie de preferencias que mis usuarios pueden establecer. Sólo quiero llamarlo una vez globalmente si es posible:
SharedPreferences settings = getSharedPreferences("prefs", 0); SharedPreferences.Editor editor = settings.edit();
Cualquier consejo sobre cómo ser capaz de llamar a estas líneas en todas las clases sería impresionante:
- ¿Cómo desplazarse por la pantalla en la prueba de espresso android? Necesito validar el texto presente en la pantalla
- No puede resolver símbolo 'MyGcmListenerService' y 'MyInstanceIDListenerService'
- Arquitectura limpia: cómo reflejar los cambios de la capa de datos en la interfaz de usuario
- Cómo ocultar la clave del API del traductor en android
- No se puede invocar getChildFragmentManager en Fragmento
editor.putString("examplesetting", "off"); editor.commit();
y
String checkedSetting = settings.getString("examplesetting", "");
- Android: SortedList con duplicados
- El carácter Unicode ("\ u232B") no se muestra en el botón
- Android: Importación DrawerLayout no se puede resolver
- ¿Cómo puedo interceptar el flujo de audio en un dispositivo Android?
- InputStream de la carpeta de activos de Android devuelve vacío
- Convertir todo el contenido en un ScrollView a un mapa de bits?
- ¿Qué sucede con un hilo de Android después de destruir la actividad que lo creó?
- Mapa de bits a gran error se queja de dos veces el tamaño de la imagen
Lo sé, lo sé, me inflamaré y meteré en las cenizas del infierno …
Utilice una clase singleton que rodea la configuración de 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 wrapper alrededor de lo que representan sus ejemplos en la pregunta, por ejemplo,
PrefSingleton.getInstance().writePreference("exampleSetting", "off");
Y la implementación podría ser 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 por la que me arriesgo a votar a la baja, es que el uso de clases estáticas globales puede ser una mala idea y va en contra de la práctica de los fundamentos de programación. PERO habiendo dicho eso, como nit-picky a un lado, se asegurará de que sólo el único objeto de la clase PrefSingleton
puede existir y ser accesible independientemente de qué actividades está en el código.
Extendería la Application
e incluiría SharedPreferences.Editor
como un 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 ella desde cualquier Activity
con
((APP) getApplication()).editSharePrefs().putString("examplesetting", "off"); ((APP) getApplication()).editsharePrefs().commit();
Alternativamente, también podría lanzar el método
public static APP getAPP(Context context) { return (APP) context.getApplicationContext(); }
Aunque, esto simplemente cambiaría las llamadas que usted hace a
APP.getAPP(this).editSharePrefs().putString("examplesetting", "off"); APP.getAPP(this).editsharePrefs().commit();
Así que realmente es una preferencia personal, que se ve más limpia para usted.
Yo haría lo 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 a sharedPrefs porque está protegido y luego es accesible a través del paquete.
In the console you have : true <-- setInhistory
Utilice una clase de ayudante para obtener todo lo que desee, hacer que los métodos sean estáticos. Así es como ADW lo hace.
Utilícelo para establecer la configuración:
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 simplemente puede utilizar this
palabra clave.
Es importante que no almacene SharedPreferences
como una variable estática. Si lo hace provoca una pérdida de memoria. Ver: http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html
- La posición de la vista de lista se cambia al desplazarse en android
- No se pudo encontrar la propiedad 'allJava' en el conjunto de fuentes principal