Cómo organizar tus configuraciones   Part of Android Jetpack.

Las pantallas de configuración grandes y complejas pueden dificultar que el usuario encuentre la configuración específica que desea cambiar. La Biblioteca de Preference ofrece las siguientes maneras de organizar mejor las pantallas de configuración.

Categorías de Preference

Si tienes varios elementos Preferences relacionados en una sola pantalla, puedes agruparlos con un PreferenceCategory. PreferenceCategory muestra el título de una categoría y la separa visualmente.

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

<androidx.preference.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>

</androidx.preference.PreferenceScreen>
Figura 1. Elementos Preference dentro de categorías.

Cómo dividir tu jerarquía en varias pantallas

Si tienes distintas categorías o varios elementos Preferences, puedes mostrarlos en pantallas separadas. Cada pantalla debería ser un PreferenceFragmentCompat con su propia jerarquía independiente. Preferences en la pantalla inicial puede luego vincular subpantallas que contengan Preferences relacionados.

La figura 2 muestra una jerarquía simple que contiene dos categorías: Messages y Sync.

Figura 2. Una jerarquía simple con dos categorías.

La figura 3 muestra el mismo conjunto de Preferences dividido en varias pantallas:

Figura 3. Una jerarquía dividida en varias pantallas.

Para vincular pantallas con un elemento Preference, puedes declarar un app:fragment en el XML o usar Preference.setFragment(). Establece el nombre completo del PreferenceFragmentCompat que debería iniciarse cuando se presione Preference, tal como se muestra a continuación:

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

Cuando un usuario presiona un Preference con un Fragment asociado, se invoca el método de interfaz PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment() . En este método, deberías mostrar la nueva pantalla e implementarla en el parámetro Activity que lo rodea.

Una implementación típica tiene el siguiente aspecto:

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,
                args)
        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(),
                args);
        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 usando un elemento <PreferenceScreen>. En su lugar, usa objetos Fragment anidados.

Cómo usar parámetros Activities independientes

De forma alternativa, si necesitas personalizar varios aspectos de cada pantalla, o si quieres usar transiciones completas de Activity entre pantallas, puedes usar un elemento Activity independiente para cada PreferenceFragmentCompat. De esta forma, podrás personalizar por completo cada Activity y su pantalla de configuración correspondiente. Este método no se recomienda para la mayoría de las aplicaciones, sino que se debe usar Fragments, como se describió anteriormente.

Para obtener más información sobre cómo usar Activities a partir de Preference, consulta Acciones de Preference.