Configuración Parte de Android Jetpack
La configuración permite que los usuarios cambien la funcionalidad y el comportamiento de una app. Pueden afectar el comportamiento en segundo plano, como la frecuencia con la que la app sincroniza datos con la nube, o pueden ser de mayor alcance, como cambiar el contenido y la presentación de la interfaz de usuario.
Para integrar los parámetros de configuración que pueda ajustar el usuario en tu app, usa la biblioteca de Preference de AndroidX. Esta biblioteca administra la interfaz de usuario e interactúa con el almacenamiento de modo que solo definas las opciones de configuración individuales que el usuario pueda ajustar. La biblioteca incluye un tema de Material Design que proporciona una experiencia del usuario coherente en todos los dispositivos y versiones de SO.
Comenzar
Un Preference
es el componente básico básico de la biblioteca de Preference. Una pantalla de configuración contiene una jerarquía de Preference
. Puedes definir esta jerarquía como un recurso XML o compilar una jerarquía mediante código.
En las siguientes secciones, se describe cómo compilar una pantalla de configuración simple mediante la biblioteca de Preference de AndroidX.
Antes de comenzar, agrega la dependencia de la biblioteca de Preference a tu archivo build.gradle
:
Groovy
dependencies { implementation "androidx.preference:preference-ktx:1.2.0" }
Kotlin
dependencies { implementation("androidx.preference:preference-ktx:1.2.0") }
Después de una sincronización de Gradle, puedes pasar a la parte XML de la tarea.
Cómo crear una jerarquía
En tu proyecto, navega a la carpeta res/xml
, crea un archivo preferences.xml
y agrégale el siguiente código:
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"> <SwitchPreferenceCompat app:key="notifications" app:title="Enable message notifications"/> <Preference app:key="feedback" app:title="Send feedback" app:summary="Report technical issues or suggest new features"/> </PreferenceScreen>
Esta jerarquía contiene dos objetos Preference
: un SwitchPreferenceCompat
que permite a los usuarios activar y desactivar una configuración, y un Preference
básico sin widgets.
Cuando se compila una jerarquía, cada Preference
debe tener una clave única.
Cómo aumentar la jerarquía
Para aumentar una jerarquía a partir de un atributo XML, crea un PreferenceFragmentCompat
, anula onCreatePreferences()
y proporciona el recurso XML que deseas aumentar, como se muestra en el siguiente ejemplo:
Kotlin
class MySettingsFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) } }
Java
public class MySettingsFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); } }
Luego, podrás agregar este Fragment
a tu Activity
de la misma manera que lo haces con cualquier otro Fragment
:
Kotlin
class MySettingsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) supportFragmentManager .beginTransaction() .replace(R.id.settings_container, MySettingsFragment()) .commit() } }
Java
public class MySettingsActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportFragmentManager() .beginTransaction() .replace(R.id.settings_container, new MySettingsFragment()) .commit(); } }
El resultado se muestra en la siguiente imagen:
![Una imagen que muestra un ejemplo de la pantalla Preference](https://developer.android.google.cn/static/develop/ui/views/components/settings/images/settings-simple.png?authuser=8&hl=es)
Preference
.
Cómo supervisar las preferencias
Para obtener un evento cuando cambie una preferencia, registra un objeto de escucha correspondiente:
Kotlin
findPreference<SwitchPreferenceCompat>("notifications") ?.setOnPreferenceChangeListener { _, newValue -> Log.d("Preferences", "Notifications enabled: $newValue") true // Return true if the event is handled. } findPreference<Preference>("feedback") ?.setOnPreferenceClickListener { Log.d("Preferences", "Feedback was clicked") true // Return true if the click is handled. }
Java
SwitchPreferenceCompat notificationsPref = findPreference("notifications"); if (notificationsPref != null) { notificationsPref.setOnPreferenceChangeListener((preference, newValue) -> { Log.d("Preferences", String.format("Notifications enabled: %s", newValue)); return true; // Return true if the event is handled. }); } Preference feedbackPref = findPreference("feedback"); if (feedbackPref != null) { feedbackPref.setOnPreferenceClickListener((preference) -> { Log.d("Preferences", "Feedback was clicked"); return true; // Return true if the event is handled. }); }
Leer el valor de preferencia actual
PreferenceFragmentCompat
oculta gran parte de la maquinaria necesaria para guardar y leer las preferencias. Sin embargo, todo se almacena con SharedPreferences
, y puedes leer estos valores como lo haces normalmente con SharedPreferences
:
Kotlin
val preferences = PreferenceManager.getDefaultSharedPreferences(this).all preferences.forEach { Log.d("Preferences", "${it.key} -> ${it.value}") }
Java
var preferences = PreferenceManager.getDefaultSharedPreferences(context).getAll(); preferences.forEach((key, value) ->{ Log.d("Preferences", String.format("%s -> %s", key, value)); });
El fragmento anterior obtiene una instancia del SharedPreferences
predeterminado para la app, accede a todos los valores almacenados, realiza un bucle sobre ellos y los muestra en Logcat.