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


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 mis métodos onCreate (y complete class) se vean 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 la jerarquía de preferencias en este activity will use, call getDefaultSharedPreferences (android.contenido.Context) con un contexto en el mismo paquete que esta actividad.

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

getSharedPreferences(name, mode)

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

Author: Ziem, 2010-04-10

5 answers

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

Update

De acuerdo con Shared Preferences | Android Developer Tutorial (Parte 13) {[29] } por Sai Geetha M N,

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

Las preferencias son típicamente pares de valor de nombre. Se pueden almacenar como "Preferencias compartidas" a través de varias actividades en un solicitud (nota actualmente no se puede compartir entre procesos). O puede ser algo que necesita ser almacenado específico 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 se pueden usar dentro de la actividad en particular y no pueden ser utilizadas por otros componentes del aplicación.

Preferencias compartidas:

Las preferencias compartidas se gestionan con la ayuda del método getSharedPreferences de la clase Context. Las preferencias se almacenan en un archivo predeterminado (1) o puede especificar un nombre de archivo (2) para ser utilizado para referirse a las preferencias.

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

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(2) Aquí es cómo se obtiene la instancia cuando especifique el nombre del archivo

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

MODE_PRIVATE es el modo de funcionamiento de las preferencias. Es el modo predeterminado y significa que el archivo creado será accedido solo por la aplicación que llama. Otros dos modos soportados son MODE_WORLD_READABLE y MODE_WORLD_WRITEABLE. En MODE_WORLD_READABLE otra aplicación puede leer el archivo creado, pero no puede modificarlo. En el caso de MODE_WORLD_WRITEABLE otras aplicaciones también tienen permisos de escritura para el archivo creado.

Finalmente, una vez que tenga la instancia de preferencias, aquí es cómo puede recuperar los valores almacenados de las preferencias:

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

Para almacenar valores en el objeto archivo de preferencias SharedPreference.Editor debe usarse. Editor es una interfaz anidada en la clase SharedPreference.

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

El 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 es necesario compartir el preferencias con otros componentes y desea tener preferencias de actividad privada puede hacerlo con la ayuda del método getPreferences() de la actividad. El método getPreference utiliza el método getSharedPreferences() con el nombre de la clase de actividad para el nombre del archivo de preferencias.

A continuación se muestra 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 las clases para implementar la interfaz de usuario de preferencias de la aplicación.

Para ver algunos ejemplos más, verifique el almacenamiento de datos de Android en el sitio de desarrolladores.

 692
Author: Pentium10,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-09 16:48:15

Si no tiene acceso a getDefaultSharedPreferenes(), puede usar getSharedPreferences(name, mode) en su lugar, solo tiene que pasar el nombre correcto.

Android crea este nombre (posiblemente basado en el nombre del paquete de tu proyecto?). Usted puede conseguirlo poniendo el siguiente código en un SettingsActivity onCreate(), y viendo lo que preferencesName es.

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

La cadena debería ser algo así como com.example.projectname_preferences. Código duro que en algún lugar de su proyecto, y pasarlo a getSharedPreferences() y usted debe ser bueno para ir.

 29
Author: Green Oak Software,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-27 18:06:36

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

Entonces llama a esto cuando quieras poner un pref:

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

Llame a esto cuando desee obtener un pref:

getPref("myKey", getApplicationContext());

O puede usar este objeto https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo lo 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);
 20
Author: kc ochibili,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-25 19:45:05

Tener que pasar 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 establecerlo en la actividad principal create

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

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

    global.globalContext = this;

También todas las claves de preferencia deben ser independientes del idioma, me sorprende que nadie haya mencionado eso.

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

Ahora llámelo muy simplemente así en una línea de código

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true);
 3
Author: hamish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-18 04:20:52

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

Use {

Context mContext;
boolean checkFlag;

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);`
 2
Author: UrviG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-21 17:48:44