studio preferencefragmentcompat not medium found example developer android android-preferences android-sharedpreferences

android - preferencefragmentcompat - PreferenceFragment-Diferencia entre getPreferenceManager() y getPreferenceScreen()?



preference screen android studio (3)

Implementé mi propia subclase PreferenceFragment (que se detalla here ) y deseo escuchar los cambios de preferencias dentro de ella. PreferenceFragment le proporciona dos formas de hacerlo:

getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

y

getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

¿Cuál debería ser usado? ¿Cual es la diferencia? Realmente no entiendo la distinción hecha en los documentos de Android .


El primero obtiene las preferencias compartidas del PreferenceManager . El segundo, desde PreferenceScreen , que hereda este método de la clase Preference .

Creo que esto no es una diferencia funcional, ya que ambas devuelven probablemente la misma instancia de los objetos SharedPreferences , pero creo que es más claro usar la primera (usando PreferenceManager lugar de PreferenceScreen ).


La diferencia principal está en sus nombres, PreferenceManger otorga acceso al desarrollador a diferentes funcionalidades para administrar las SharedPreferences , como recuperar el mapa de los valores de preferencia actuales o configurar las preferencias del usuario. a sus valores predeterminados. PreferenceScreen maneja mostrando una pantalla de preferencias del usuario, para que el usuario pueda asignarle valores. A veces esto significa mostrar un elemento de la lista en una pantalla con otras preferencias, que abre otra pantalla con más preferencias cuando se hace clic, como es el caso cuando las pantallas PreferenceScreen están anidadas.

Su pregunta implica que usted piensa que hay una diferencia entre lo que hace PreferenceManager.getSharedPreferences() y PreferenceScreen.getSharedPreferences() , pero de acuerdo con el código fuente, son idénticos.

PreferenceScreen :

public SharedPreferences getSharedPreferences() { if (mPreferenceManager == null) { return null; } return mPreferenceManager.getSharedPreferences(); }

Por lo tanto, PreferenceManger y PreferenceScreen son entidades diferentes, pero la SharedPreference que devuelve el método debe ser el mismo objeto, ya que PreferenceScreen llama al método desde PreferenceManager . Espero que esa sea la respuesta que has estado buscando.

Si tiene una opción, vaya a PreferenceManager.getSharedPreferences() , es más obvio y un método menos llama internamente.

Hecho de la diversión:

PreferenceFragment :

public PreferenceManager getPreferenceManager() { return mPreferenceManager; } public PreferenceScreen getPreferenceScreen() { return mPreferenceManager.getPreferenceScreen(); }


PreferenceScreen ver la domentación here

La clase PreferenceScreen puede aparecer en dos lugares:

  • Cuando una actividad de preferencia apunta a esto, se usa como raíz y no se muestra (solo se muestran las preferencias incluidas).
  • Cuando aparece dentro de otra jerarquía de preferencias, se muestra y sirve como puerta de enlace a otra pantalla de preferencias (ya sea mostrando otra pantalla de preferencias como un cuadro de diálogo o una startActivity (android.content.Intent) de getIntent ()). Los niños de esta PreferenceScreen NO se muestran en la pantalla en la que se muestra esta PreferenceScreen. En su lugar, se mostrará una pantalla por separado cuando se haga clic en esta preferencia.

PreferenceManager vea la documentación here :

Diferencia :

getPreferenceManager () devuelve el administrador de preferencias actual asociado con el fragmento.

getPreferenceScreen () devuelve la PreferenceScreen raíz, es decir, la pantalla de preferencias de raíz utilizada en el fragmento del archivo xml de preferencias (preferences.xml).