21

Supongamos que tengo una aplicación que guarda las preferencias en dos archivos, preferences1.xml y preferences2.xml. Entonces, puedo recuperar referencias a los objetos que corresponden con el siguiente código:Marco de casos múltiples SharedPreferences/archivos

SharedPreferences sharedPrefs1 = getSharedPreferences("preferences1", MODE_PRIVATE); 
SharedPreferences sharedPrefs2 = getSharedPreferences("preferences2", MODE_PRIVATE); 

De esta manera puedo manipular las preferencias de ambos y registrar detectores de cambios en ambos.

tengo algunas dudas sobre la inicialización de esos dos archivos, con setDefaultValues ​​:

Pregunta 1 - PreferenceFragment contexto: He creado un PreferenceActivity con dos PreferenceFragments y dentro de la 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 establecen correctamente sus preferencias con sus valores por defecto cuando se inicia .. pero, dado el hecho de que yo pueda ver un solo archivo _has_set_default_values.xml en los shared_prefs directorio de la aplicación, ¿Cómo se entiende cuando las propiedades de preferences1.xml y preferences2.xml ya se han configurado? Este archivo se crea tan pronto como setDefaultValues ​​ se llama en la primera abrió PreferenceFragment, pero incluso después de que, si abro la segunda PreferenceFragment inicializa correctamente los valores por defecto. ¿Cómo entiende que todavía no se 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 - Actividad contexto estándar: cuando comienzo mi aplicación, la PreferenceActivity no es la primera actividad se inició y el usuario nunca podrá abrirla, así que me gustaría para inicializar los dos archivos de preferencias con su 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 el que PreferenceManager funcionará, ya que no estamos en una PreferenceActivity, simplemente quiero inicializar esos dos archivos ... ¿Alguna ayuda? Espero haber publicado una pregunta clara, incluso si es demasiado larga.

+1

@crazymaik He borrado mi respuesta porque no creo responde la pregunta satisfactoriamente He pasado algunas horas investigando esto por ahora, y sigue siendo un completo misterio ... Espero que alguien más pueda arrojar algo de luz sobre él. –

+0

¿puedes explicar más sobre SO Chat? – KOTIOS

+0

intente utilizar un prefijo .Namespace dentro de un único archivo físico para gestionar 2 conjuntos lógicos o categorías de preferencias dentro de un identificador de archivo único. Sus respectivos fragmentos deberían poder aplicar el prefijo NS de una manera que no sea demasiado perjudicial para sus operaciones CRUD en las propiedades pref. –

Respuesta

-2

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 la aplicación.

http://developer.android.com/reference/android/app/Application.html

Application.onCreate es la primera cosa que se ejecuta cuando el usuario inicia la 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.

0

para la pregunta 1

Creo que el _has_set_default_values.xml archivo es más que otro archivo de preferencias ... y almacena pares clave/valor allí donde la clave es el nombre del archivo de preferencias y el valor es si se han establecido los valores predeterminados.

para la pregunta 2

Por qué no utilizar la versión de PreferenceManager.setDefaultValues ​​() que lleva el nombre de las preferencias compartidas presentar? 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

1

puede crear una preferencia como esto:

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 reserva de servicios o cualquier otra cosa que quieres hacer con su preferencia los datos ahorrarán en ambos archivos.

y la segunda pregunta:

crear una clase mundial como G

y luego declaran su preferencia como esto:

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 su actividad principal se ejecuta que debe hacer como esto :

G.currentActivity = MainActivity.this; 
G. myAppPref.saveServices("testpref", true); 
Cuestiones relacionadas