Organizza le impostazioni Componente di Android Jetpack.

Schermate di impostazioni grandi e complesse possono rendere difficile per un utente trovare un'impostazione specifica da modificare. La libreria Preferenze offre i seguenti modi per organizzare meglio le schermate delle impostazioni.

Categorie di preferenza

Se hai diversi oggetti Preference correlati su una singola schermata, puoi raggrupparli utilizzando un PreferenceCategory. Un elemento PreferenceCategory mostra il titolo di una categoria e separa visivamente la categoria.

Per definire un PreferenceCategory in XML, aggrega i tag Preference con un PreferenceCategory come segue:

<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>

Il risultato sarà simile al seguente:

Un&#39;immagine che mostra le preferenze con le categorie
Figura 1. Preferenze all'interno delle categorie.

Suddividi la gerarchia in più schermate

Se hai un numero elevato di Preference oggetti o categorie distinte, puoi visualizzarli in schermate separate. Ogni schermata è una PreferenceFragmentCompat con una propria gerarchia separata. Preference oggetti nella schermata iniziale possono quindi collegarsi a schermate secondarie contenenti le preferenze correlate.

La Figura 2 mostra una gerarchia semplice che contiene due categorie: Messaggi e Sincronizzazione.

Un&#39;immagine che mostra una schermata delle preferenze con gerarchie
Figura 2. Una gerarchia semplice con due categorie.

La figura 3 mostra lo stesso insieme di preferenze suddiviso in più schermate:

Un&#39;immagine che mostra una gerarchia suddivisa in più schermate
Figura 3. Una gerarchia suddivisa in più schermate.

Per collegare le schermate con un Preference, puoi dichiarare un app:fragment in XML o puoi utilizzare Preference.setFragment(). Avvia il nome completo del pacchetto PreferenceFragmentCompat quando viene toccato Preference, come mostrato nell'esempio seguente:

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

Quando un utente tocca un Preference con un Fragment associato, viene richiamato il metodo di interfaccia PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment(). In questo metodo puoi gestire la visualizzazione della nuova schermata e implementare la schermata nell'ambiente Activity circostante.

Una tipica implementazione è simile alla seguente:

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;
    }
}

Schermate preferenze

La dichiarazione di gerarchie nidificate all'interno della stessa risorsa XML mediante un elemento &lt;PreferenceScreen&gt; nidificato non è più supportata. Utilizza invece oggetti Fragment nidificati.

Usa attività separate

In alternativa, se devi personalizzare in modo significativo ogni schermata o se vuoi eseguire transizioni Activity complete tra le schermate, puoi utilizzare un Activity separato per ogni PreferenceFragmentCompat. In questo modo puoi personalizzare completamente ogni Activity e la schermata delle impostazioni corrispondente. Questa opzione non è consigliata per la maggior parte delle app; utilizza invece Fragments come descritto in precedenza.

Per ulteriori informazioni sull'avvio di un Activity da una Preference, consulta Azioni relative alle preferenze.