Configuración   Parte de Android Jetpack

La configuración les permite a los usuarios cambiar la funcionalidad y el comportamiento de una app. Los parámetros de configuración afectan el comportamiento en segundo plano, como la frecuencia con la que la app sincroniza datos con la en la nube o pueden tener un alcance más amplio, como cambiar el contenido y presentación de la interfaz de usuario.

Para integrar en la app opciones de configuración que pueda ajustar el usuario, usa AndroidX. Biblioteca de Preference. Esta biblioteca administra la interfaz de usuario e interactúa con de forma que solo se definan los parámetros de configuración individuales configurar. La biblioteca incluye un tema de Material Design que proporciona un experiencia del usuario coherente en todos los dispositivos y versiones de SO.

Comenzar

Un objeto Preference es el edificio básico. bloque de la Biblioteca de Preference. Una pantalla de configuración contiene un Preference jerarquía. Puedes definir esta jerarquía como un recurso XML o crear una jerarquía en el código.

En las siguientes secciones, se describe cómo compilar una pantalla de configuración simple con la API de Biblioteca de Preference de AndroidX.

Antes de comenzar, agrega la dependencia de la Biblioteca de Preference a tu build.gradle. archivo:

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 o desactivar un parámetro de configuración y un Preference básico sin widget.

Cuando compilas 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 una PreferenceFragmentCompat: anular onCreatePreferences(), y proporciona el recurso XML para 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 como 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 de Preferencias
Figura 1: Una pantalla de configuración creada con dos Preference objetos.

Cómo supervisar las preferencias

Para obtener un evento cuando cambie una preferencia, registra un objeto de escucha para de la siguiente manera:

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 SharedPreferences, y puedes leer estos valores como lo harías 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, los repite y los imprime Logcat.