¿Cómo obtengo las preferencias compartidas de una actividad de preferencias en Android?

373

Estoy usando una PreferenceActivity para mostrar algunas configuraciones para mi aplicación. Estoy inflando la configuración a través de un archivo xml para que mi onCreate (y los métodos de clase completos) se ve así:

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

El javadoc de PreferenceActivity PreferenceFragment establece que

Estas preferencias se guardarán automáticamente en SharedPreferences a medida que el usuario interactúe con ellas. Para recuperar una instancia de SharedPreferences que utilizará la jerarquía de preferencias en esta actividad, llame a getDefaultSharedPreferences (android.content.Context) con un contexto en el mismo paquete que esta actividad.

Pero, ¿cómo obtengo el nombre de SharedPreference en otra actividad? Solo puedo llamar

getSharedPreferences(name, mode)

en la otra actividad pero necesito el nombre de SharedPreference que fue utilizado por PreferenceActivity. ¿Cuál es el nombre o cómo puedo recuperarlo?

Dave
fuente

Respuestas:

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

Actualizar

Según las preferencias compartidas | Tutorial para desarrolladores de Android (Parte 13) de Sai Geetha MN,

Muchas aplicaciones pueden proporcionar una forma de capturar las preferencias del usuario en la configuración de una aplicación o actividad específica. Para respaldar esto, Android proporciona un conjunto simple de API.

Las preferencias son típicamente pares de valores de nombre. Se pueden almacenar como "Preferencias compartidas" en varias actividades en una aplicación (tenga en cuenta que actualmente no se puede compartir en todos los procesos). O puede ser algo que necesita ser almacenado específicamente para una actividad.

  1. Preferencias compartidas: las preferencias compartidas pueden ser utilizadas por todos los componentes (actividades, servicios, etc.) de las aplicaciones.

  2. Preferencias manejadas por la actividad: Estas preferencias solo pueden usarse dentro de la actividad particular y no pueden ser usadas por otros componentes de la aplicación.

Preferencias compartidas:

Las preferencias compartidas se gestionan con la ayuda del getSharedPreferencesmétodo de la Contextclase. Las preferencias se almacenan en un archivo predeterminado (1) o puede especificar un nombre de archivo (2) para usarlo para referirse a las preferencias.

(1) La forma recomendada es utilizar el modo predeterminado, sin especificar el nombre del archivo

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(2) Así es como obtiene la instancia cuando especifica el nombre del archivo

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

MODE_PRIVATEes el modo operativo para las preferencias. Es el modo predeterminado y significa que solo la aplicación que llama accederá al archivo creado. Otros dos modos compatibles son MODE_WORLD_READABLEy MODE_WORLD_WRITEABLE. En MODE_WORLD_READABLEotra aplicación puede leer el archivo creado pero no puede modificarlo. En el caso de MODE_WORLD_WRITEABLEotras aplicaciones también tienen permisos de escritura para el archivo creado.

Finalmente, una vez que tenga la instancia de preferencias, así es como puede recuperar los valores almacenados de las preferencias:

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

Para almacenar valores en el archivo de preferencias SharedPreference.Editorse debe utilizar el objeto. Editores una interfaz anidada en la SharedPreferenceclase.

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

Editor también admite métodos como remove()y clear()para eliminar los valores de preferencia del archivo.

Preferencias de actividad:

Las preferencias compartidas pueden ser utilizadas por otros componentes de la aplicación. Pero si no necesita compartir las preferencias con otros componentes y desea tener preferencias privadas de actividad, puede hacerlo con la ayuda del getPreferences()método de la actividad. El getPreferencemétodo utiliza el getSharedPreferences()método con el nombre de la clase de actividad para el nombre del archivo de preferencias.

El siguiente es el código para obtener preferencias

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

El código para almacenar valores también es el mismo que en el caso de las preferencias compartidas.

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

También puede usar otros métodos como almacenar el estado de la actividad en la base de datos. Nota Android también contiene un paquete llamado android.preference. El paquete define clases para implementar la interfaz de usuario de preferencias de la aplicación.

Para ver más ejemplos, consulte la publicación de almacenamiento de datos de Android en el sitio de desarrolladores.

Pentium10
fuente
55
+1: me salvaste el día ... ninguno de los tutoriales / ejemplos en Internet habla sobre esto. todo lo que hablan sobre funciones y personalizaciones, pero no cómo leerlo.
ankitjaininfo
1
Vea mi actualización de la respuesta, y el nombre de archivo es algo parecido, package.prefspero no estoy seguro.
Pentium10
1
Gracias por el codigo. Solo hay una pequeña cosa que me confunde: SharedPreference es una interfaz, entonces, ¿dónde está implementado el código real que maneja las llamadas a métodos?
x1886x
1
Ojalá hubiera leído esto una semana antes de perder el tiempo leyendo algunas respuestas / comentarios estúpidos de nerds en todo SE, que piensan que saben cuando en realidad no lo saben ... Gracias @ Pentium10, ¿tienes algún blog? Gracias de nuevo, realmente lo aprecio. :)
Sanjeevcn
1
En lugar de usar editor.commit (), también puedes usar editor.apply (). La diferencia es que commit () escribe sus cambios sincrónicamente y apply los escribe asincrónicamente. Esto hace que tu IU sea más rápida.
Hashim Akhtar
29

Si no tiene acceso getDefaultSharedPreferenes(), puede usarlo getSharedPreferences(name, mode), solo tiene que pasar el nombre correcto.

Android crea este nombre (¿posiblemente basado en el nombre del paquete de su proyecto?). Puede obtenerlo colocando el siguiente código en a SettingsActivity onCreate()y viendo qué preferencesNamees.

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

La cadena debería ser algo así com.example.projectname_preferences. Codifique eso en algún lugar de su proyecto, páselo getSharedPreferences()y debería estar listo para comenzar.

Software de roble verde
fuente
1
La fuente de la actividad lee: public SharedPreferences getPreferences (int mode) {return getSharedPreferences (getLocalClassName (), mode); }
Tatarize
22

Declare estos métodos primero.

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

Luego llame a esto cuando quiera poner un pref:

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

llama a esto cuando quieras obtener un pref:

getPref("myKey", getApplicationContext());

O puede usar este objeto https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo que simplifica todo aún más

Ejemplo:

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
fuente
¿Por qué no usar editor.apply (); en lugar de comprometerse para el procesamiento en segundo plano
Avi Parshan
4

tener que pasar el contexto por todas partes me molesta mucho. el código se vuelve demasiado detallado e inmanejable. Hago esto en cada proyecto en su lugar ...

public class global {
    public static Activity globalContext = null;

y configurarlo en la actividad principal crear

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

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

    global.globalContext = this;

Además, todas las teclas de preferencia deben ser independientes del idioma, me sorprende que nadie haya mencionado eso.

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

ahora llámalo simplemente así en una línea de código

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true);
hamish
fuente
44
¿Cuál es la ventaja de hacer que el lenguaje de las teclas sea independiente? Nunca se muestran al usuario, ¿verdad?
Gerd
1
Por favor, por el amor de Dios, nunca use una Actividad como Contexto global. Si tiene que usar un contexto global, hágalo utilizando una clase de aplicación personalizada.
Thorben
1
@Thorben De acuerdo. O simplementegetApplicationContext()
OneCricketeer el
3

si tiene una casilla de verificación y desea obtener su valor, es decir, verdadero / falso en cualquier archivo java--

Utilizar--

Context mContext;
boolean checkFlag;

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

Actualizado 2019

Simplemente puedes usar la PowerPreferencebiblioteca

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

Obtener instancia de preferencia compartida

Para obtener la instancia predeterminada solo necesita llamar

PowerPreference.getDefaultFile()

O si quieres un archivo de preferencia específico

PowerPreference.getFileByName(fileName)

Escribir datos:

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

Obteniendo datos

PowerPreference.getDefaultFile().getString(key,value)
Ali Asadi
fuente
¿Cómo maneja PowerPreference la parte de contexto? Se requiere un contexto para leer las preferencias compartidas, ¿no? Soy nuevo en Android y trato de entenderlo.
Yeti
0

Intenta seguir el código fuente que funcionó para mí

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