preferencia - como usar sharedpreferences android studio
Establecer valores predeterminados de múltiples instancias/archivos de SharedPreferences (3)
Supongamos que tengo una aplicación que guarda las preferencias en dos archivos, preferences1.xml y preferences2.xml . Luego, puedo recuperar referencias a los objetos correspondientes con el siguiente código:
SharedPreferences sharedPrefs1 = getSharedPreferences("preferences1", MODE_PRIVATE);
SharedPreferences sharedPrefs2 = getSharedPreferences("preferences2", MODE_PRIVATE);
De esta forma puedo manipular las preferencias para ambos y registrar oyentes para cambios en ambos.
Tengo algunas dudas sobre la inicialización de esos dos archivos, con setDefaultValues :
Pregunta 1 - Contexto de PreferenceFragment : He creado una PreferenceActivity con dos PreferenceFragments y dentro del método onCreate de cada uno ejecuto el siguiente código (reemplace X con 1 y 2 para el fragmento 1 y 2):
PreferenceManager pm = getPreferenceManager();
pm.setSharedPreferencesName("preferencesX");
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragmentX, false);
He visto que ambos fragmentos configuran correctamente sus preferencias con sus valores predeterminados cuando se lanzan ... pero, dado el hecho de que solo puedo ver un solo archivo _has_set_default_values.xml en el directorio shared_prefs de la aplicación, ¿cómo lo entiende cuando las propiedades de preferences1.xml y preferences2.xml ya se han configurado? Este archivo se crea tan pronto como se llama a setDefaultValues en el primer PreferenceFragment abierto, pero incluso después de eso, si abro el segundo PreferenceFragment, se inicializan correctamente los valores predeterminados. ¿Cómo entiende que aún no ha inicializado preferences2.xml y cuál es el propósito de _has_set_default_values.xml dado el hecho de que no contiene información sobre qué archivos de preferencias se han inicializado?
Pregunta 2: contexto de actividad estándar : cuando inicio mi aplicación, la actividad de preferencia no es la primera actividad que se inicia y el usuario nunca puede abrirla, por lo que me gustaría inicializar los dos archivos de preferencias con sus valores predeterminados también en la actividad principal. ¿Cómo puedo hacer eso? Para las preferencias compartidas predeterminadas, es fácil:
PreferenceManager.setDefaultValues(this, R.xml.default_preferences, false);
Para dos archivos de preferencias, ¿cómo debo hacer? No puedo hacer algo como lo siguiente ya que no puedo recuperar una instancia de PreferenceManager como en las clases PreferenceFragment :
PreferenceManager pm = getPreferenceManager(); // NOT AVAILABLE AND NOT WANTED
pm.setSharedPreferencesName("preferences1");
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragment1, false);
PreferenceManager pm = getPreferenceManager(); // NOT AVAILABLE AND NOT WANTED
pm.setSharedPreferencesName("preferences2");
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragment2, false);
Aquí en la Actividad principal no tengo la necesidad de cambiar los archivos de preferencias en los que funcionará PreferenceManager , ya que no estamos en una Actividad de preferencia , simplemente quiero inicializar esos dos archivos ... ¿Alguna ayuda? Espero haber publicado una pregunta clara, incluso si es demasiado larga.
1) Supongo que esos valores predeterminados solo se cargarán si se usa el método getDefaultSharedPreferences (), y se ignorarán si proporciona su propio archivo de preferencias. No estoy seguro de esto.
2) Puede configurarlos en una subclase de aplicación.
http://developer.android.com/reference/android/app/Application.html
Application.onCreate es lo primero que se ejecutará cuando el usuario inicie su aplicación. Es un único punto de entrada a su aplicación y, por lo tanto, es un buen lugar para inicializar todos los datos que su aplicación necesita en todo el sistema.
Dado que la Aplicación extiende ContextWrapper, tiene acceso a las Preferencias Compartidas a través del método getSharedPreferences (archivo, modo). Puede usarlo para recuperar sus dos archivos de preferencias.
puedes crear una preferencia como esta:
public class MyPreference {
private static final String APP_SHARED_PREFS1 = "myPrefc1";
private static final String APP_SHARED_PREFS2 = "myPrefc2";
private SharedPreferences appSharedPrefs1;
private SharedPreferences appSharedPrefs2;
private Editor prefsEditor1;
private Editor prefsEditor2;
public MyPreference(Context context) {
this.appSharedPrefs1 = context.getSharedPreferences(APP_SHARED_PREFS1, Activity.MODE_PRIVATE);
this.appSharedPrefs2 = context.getSharedPreferences(APP_SHARED_PREFS2, Activity.MODE_PRIVATE);
this.prefsEditor1 = appSharedPrefs1.edit();
this.prefsEditor2 = appSharedPrefs2.edit();
}
public void saveServices(String servicName, boolean isActivated) {
prefsEditor1.putBoolean(servicName, isActivated);
prefsEditor1.commit();
prefsEditor2.putBoolean(servicName, isActivated);
prefsEditor2.commit();
}
en su servicio de guardado u otra cosa que desee hacer con su preferencia, los datos se guardarán en ambos archivos.
y para su segunda pregunta:
crea una clase Global como G
y luego declara tu preferencia así:
public class G extends Application{
public static Activity currentActivity = null;
public static MyPreference myAppPref = null;
@Override
public void onCreate() {
super.onCreate();
myAppPref = new MyPreference(G.this);
}
}
y cuando se ejecute tu actividad principal deberías hacer esto:
G.currentActivity = MainActivity.this;
G. myAppPref.saveServices("testpref", true);
Para la pregunta 1
Creo que el archivo _has_set_default_values.xml es solo otro archivo de preferencias ... y almacena los pares clave / valor allí con la clave que es el nombre del archivo de preferencias y el valor de si se han establecido los valores predeterminados.
Para la pregunta 2
¿Por qué no usar la versión de PreferenceManager.setDefaultValues () que toma el nombre del archivo de preferencias compartidas? Esta es la firma del método:
public static void setDefaultValues (Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)
http://developer.android.com/reference/android/preference/PreferenceManager.html