Cómo organizar tus parámetros de configuración Parte de Android Jetpack.

Las pantallas de configuración grandes y complejas pueden dificultar que el usuario encuentre una parámetro de configuración específico que desean cambiar. La biblioteca de Preference ofrece la seguir maneras de organizar mejor tus pantallas de configuración.

Categorías de Preference

Si tienes varios temas relacionados objetos Preference en un solo pantalla, puedes agruparlos usando un PreferenceCategory R PreferenceCategory muestra un título de categoría y separa visualmente el categoría.

Para definir un PreferenceCategory en XML, une las etiquetas Preference con un PreferenceCategory de la siguiente manera:

<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 se ve de la siguiente manera:

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 PreferenceFragmentCompat con su propia jerarquía independiente Preference objeto en la pantalla inicial pueden vincularse a subpantallas que contienen preferencias.

La Figura 2 muestra una jerarquía simple que contiene dos categorías: Mensajes y Sincronizar.

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

La Figura 3 muestra el mismo conjunto de preferencias dividido en varias pantallas:

Una imagen que muestra una jerarquía dividida en varias pantallas
Figura 3: Una jerarquía dividida en varias pantallas

Para vincular pantallas con un Preference, puedes declarar un app:fragment en XML o puedes 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(). Este método te permite controlar la visualización de la nueva pantalla y dónde se implementa la pantalla 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

Declara jerarquías anidadas dentro del mismo recurso XML con un elemento anidado Ya no se admite &lt;PreferenceScreen&gt;. Cómo usar objetos Fragment anidados en su lugar.

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, recomendó 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.