Cómo organizar tu configuración Parte de Android Jetpack.

Un usuario puede tener dificultades en las pantallas de configuración grandes y complejas a la hora de encontrar una configuración específica que quiera cambiar. La biblioteca de Preference ofrece las siguientes formas de organizar mejor tus pantallas de configuración.

Categorías de Preference

Si tienes varios objetos Preference relacionados en una sola pantalla, puedes agruparlos mediante un PreferenceCategory. Un objeto PreferenceCategory muestra el título de una categoría y la separa visualmente.

Para definir un PreferenceCategory en XML, une las etiquetas Preference con un PreferenceCategory, como se muestra a continuación:

<PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <PreferenceCategory
        app:key="notifications_category"
        app:title="Notifications">

        <SwitchPreferenceCompat
            app:key="notifications"
            app:title="Enable message notifications"/>

    </PreferenceCategory>

    <PreferenceCategory
        app:key="help_category"
        app:title="Help">

        <Preference
            app:key="feedback"
            app:summary="Report technical issues or suggest new features"
            app:title="Send feedback"/>

    </PreferenceCategory>

</PreferenceScreen>

El resultado es similar al siguiente:

Una imagen que muestra preferencias con categorías
Figura 1: Preferencias dentro de las categorías.

Cómo dividir una jerarquía en varias pantallas

Si tienes una gran cantidad de objetos Preference o categorías distintas, puedes mostrarlos en pantallas separadas. Cada pantalla es un objeto PreferenceFragmentCompat con su propia jerarquía independiente. Los objetos Preference de la pantalla inicial pueden vincularse a subpantallas que contengan preferencias relacionadas.

En la Figura 2, se muestra una jerarquía simple que contiene dos categorías: Mensajes y Sincronización.

Una imagen que muestra una pantalla de preferencias con jerarquías
Figura 2: Una jerarquía simple con dos categorías.

En la Figura 3, se muestra el mismo conjunto de preferencias dividido en varias pantallas:

Imagen que muestra una jerarquía dividida en varias pantallas
Figura 3: Es una jerarquía dividida en varias pantallas.

Para vincular pantallas con un Preference, puedes declarar un app:fragment en XML o usar Preference.setFragment(). Inicia el nombre completo del paquete de PreferenceFragmentCompat cuando se presiona Preference, como se muestra en el siguiente ejemplo:

<Preference
        app:fragment="com.example.SyncFragment"
        .../>

Cuando un usuario presiona un objeto Preference con un objeto Fragment asociado, se llama al método de la interfaz PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment(). Ese método es donde controlas la visualización de la nueva pantalla y donde esta se implementa en el objeto Activity circundante.

Una implementación típica será similar a la siguiente:

Kotlin

class MyActivity : AppCompatActivity(),
    PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
    ...
    override fun onPreferenceStartFragment(caller: PreferenceFragmentCompat, pref: Preference): Boolean {
        // Instantiate the new Fragment.
        val args = pref.extras
        val fragment = supportFragmentManager.fragmentFactory.instantiate(
                classLoader,
                pref.fragment)
        fragment.arguments = args
        fragment.setTargetFragment(caller, 0)
        // Replace the existing Fragment with the new Fragment.
        supportFragmentManager.beginTransaction()
                .replace(R.id.settings_container, fragment)
                .addToBackStack(null)
                .commit()
        return true
    }
}

Java

public class MyActivity extends AppCompatActivity implements
        PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
    ...
    @Override
    public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) {
        // Instantiate the new Fragment.
        final Bundle args = pref.getExtras();
        final Fragment fragment = getSupportFragmentManager().getFragmentFactory().instantiate(
                getClassLoader(),
                pref.getFragment());
        fragment.setArguments(args);
        fragment.setTargetFragment(caller, 0);
        // Replace the existing Fragment with the new Fragment.
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.settings_container, fragment)
                .addToBackStack(null)
                .commit();
        return true;
    }
}

PreferenceScreens

Ya no se admite la declaración de jerarquías anidadas dentro del mismo recurso XML con un &lt;PreferenceScreen&gt; anidado. En su lugar, usa objetos Fragment anidados.

Cómo usar objetos Activity individuales

Como alternativa, si necesitas personalizar mucho cada pantalla, o si quieres transiciones completas de Activity, puedes usar un objeto Activity individual para cada PreferenceFragmentCompat. Al hacer esto, puedes personalizar totalmente cada Activity y su pantalla de configuración correspondiente. Para la mayoría de las apps, no recomendamos esto. En su lugar, usa Fragments como se describió anteriormente.

Si quieres obtener más información para iniciar un Activity a partir de un Preference, consulta Acciones de Preference.