2010-04-10 23 views
328

Estoy usando una actividad de preferencia 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 métodos de clase completas) se ve así:¿Cómo obtengo las Preferencias Compartidas desde una Actividad Preferencial en Android?

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

el Javadoc de PreferenceActivityPreferenceFragment afirma que

Estas preferencias se guarda automáticamente a SharedPreferences mientras el usuario interactúa con ellos. 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? Sólo puedo llamar

getSharedPreferences(name, mode) 

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

Respuesta

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

actualización

Según Shared Preferences | Android Developer Tutorial (Part 13) por Sai Gita M N,

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

Las preferencias son típicamente pares de valores de nombres. Se pueden almacenar como "Preferencias compartidas" entre varias actividades en una aplicación (nota actualmente no se puede compartir entre procesos). O puede ser algo que debe almacenarse específico para una actividad.

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

  2. Preferencias de manejo de actividades: estas preferencias solo se pueden usar dentro de la actividad particular y no pueden ser utilizadas por otros componentes de la aplicación.

Preferencias compartidas:

Las preferencias compartidas son gestionados con la ayuda de getSharedPreferences método de la clase Context. Las preferencias se almacenan en un archivo predeterminado (1) o puede especificar un nombre de archivo (2) que se utilizará para hacer referencia a las preferencias.

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

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 

(2) Así es como se obtiene la instancia cuando se especifica 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 para las preferencias. Es el modo predeterminado y significa que solo se accederá al archivo creado desde la aplicación de llamada. Otros dos modos admitidos 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.

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

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

Para almacenar valores en el archivo de preferencias SharedPreference.Editor objeto tiene que ser utilizado . Editor es una interfaz anidada en la clase SharedPreference.

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

Editor también es compatible con métodos como remove() y clear() suprimir los valores de preferencia del archivo.

Preferencias

Actividad:

Las preferencias compartidas pueden ser utilizados 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 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 de archivo de preferencia.

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 es también 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 utilizar 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 IU de preferencias de la aplicación.

Para ver algunos ejemplos más, consulte la publicación Data Storage de Android en el sitio de desarrolladores.

+51

+1: u salvó mi día .. ninguno de los tutoriales/ejemplos en Internet habla de esto. todo lo que hablan abt características y personalizaciones, pero no cómo leerlo. – ankitjaininfo

+0

por cierto, ¿cuál es el "nombre" del archivo en este caso? – ankitjaininfo

+1

Ver mi actualización de la respuesta, y el nombre del archivo es algo así como 'package.prefs', pero no estoy seguro. – Pentium10

29

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 su proyecto?). Puede obtenerlo poniendo el siguiente código en un SettingsActivityonCreate(), y viendo qué es preferencesName.

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

La secuencia debe ser algo así como com.example.projectname_preferences. Código difícil que en algún lugar de su proyecto, y pasarlo a getSharedPreferences() y debe estar listo para ir.

+0

El origen de la actividad dice: publicPreferences SharedPreferences (modo int) { return getSharedPreferences (getLocalClassName(), mode); } – Tatarize

18

primero declarar estos métodos ..

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 llaman a esto cuando se quiere poner un pref:

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

llaman a esto cuando se desea obtener una pref:

getPref("myKey", getApplicationContext()); 

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

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); 
+0

¿Por qué no utilizar editor.apply(); en lugar de comprometerse a procesar en segundo plano –

2

tener que pasar por todas partes contexto es muy molesto conmigo. el código se vuelve demasiado detallado e inmanejable. Lo hago en cada proyecto en lugar ...

public class global { 
    public static Activity globalContext = null; 

y la puse en la actividad principal de crear

@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 debe ser independiente del lenguaje, no soy nadie ha mencionado que sorprendida.

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

ahora llamar de manera muy simple como esto en una línea de código

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true); 
+3

¿Cuál es la ventaja de hacer que el lenguaje de claves sea independiente? Nunca se muestran al usuario, ¿verdad? – Gerd

+1

Por favor, por el amor de Dios, nunca use una Actividad como un Contexto global. Si tiene que usar un contexto global, hágalo utilizando una clase de aplicación personalizada. – Thorben

+1

@Thorben de acuerdo. O simplemente 'getApplicationContext()' –

2

si tiene una casilla de verificación y que le gustaría a buscar es decir, valor verdadero/falso en cualquier java file--

servicio-

Context mContext; 
boolean checkFlag; 

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);` 
Cuestiones relacionadas