2012-07-31 58 views
62

Estoy tratando de leer SharedPreferences dentro de Fragment. Mi código es lo que uso para obtener preferencias en cualquier otra actividad.Android SharedPreferences en Fragment

 SharedPreferences preferences = getSharedPreferences("pref", 0); 

me sale error

Cannot make a static reference to the non-static method getSharedPreferences(String, int) from the type ContextWrapper  

he tratado de seguir estos enlaces, pero sin suerte Accessing SharedPreferences through static methods y Static SharedPreferences. Gracias por cualquier solución.

Respuesta

176

El método getSharedPreferences es un método del objeto Context, por lo que no bastará con llamar a getSharedPreferences desde un Fragment ... ¡porque no es un contexto! (La actividad es una extensión de Contexto, por lo que podemos llamar a getSharedPreferences).

lo que tiene que obtener su Contexto aplicaciones por

// this = your fragment 
SharedPreferences preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE); 
+1

getSharedPreferences ("pref", 0); cero (0) significa lo privado/público? – Kailas

+0

@Kailas correcto, el modo, es decir, WORLD_READABLE ect. http://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String, int) – Jug6ernaut

+0

qué tipo de modo utilicé las preferencias compartidas solo acceden a esa aplicación ninguna otra aplicación leer/escribir que valores de preferencias compartidas? – Kailas

4

Como nota de precaución esta respuesta proporcionada por el usuario por encima de mí es correcta.

SharedPreferences preferences = this.getActivity().getSharedPreferences("pref",0); 

Sin embargo, si se intenta conseguir cualquier cosa en el fragmento antes onAttach se llama getActivity() devolverá nulo.

+1

y la actividad no se inicializa completamente hasta que onActivityCreated se llame ... – hotzen

9

La respuesta marcada no funcionó para mí, tuve que usar

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 

EDIT:

O simplemente tratar de retirar la this:

SharedPreferences prefs = getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE); 
+3

La respuesta marcada no le funcionó porque está accediendo a las preferencias compartidas predeterminadas. Un mejor diseño es almacenar sus preferencias no como un objeto compartido sino en un espacio separado y privado, que es de lo que se trata la pregunta y la respuesta aquí. – zeeshan

0

Puede hacer que el SharedPrefences en onAttach método de fragmento como este:

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    SharedPreferences preferences = context.getSharedPreferences("pref", 0); 
} 
Cuestiones relacionadas