Organizar as configurações Parte do Android Jetpack.

Telas de configurações grandes e complexas podem dificultar que o usuário encontre uma configuração específica que ele queira mudar. A biblioteca Preference oferece as seguintes maneiras de organizar melhor as telas de configurações.

Categorias de preferência

Se você tiver vários objetos Preference relacionados em uma única tela, poderá agrupá-los usando um PreferenceCategory. Um PreferenceCategory mostra o título de uma categoria e a separa visualmente.

Para definir um PreferenceCategory em XML, una as tags Preference com um PreferenceCategory, da seguinte maneira:

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

O resultado será semelhante a este:

Uma imagem que mostra preferências com categorias
Figura 1. Preferências dentro de categorias.

Divida sua hierarquia em várias telas

Se você tiver um grande número de objetos Preference ou categorias distintas, poderá mostrá-los em telas separadas. Cada tela é um PreferenceFragmentCompat com a própria hierarquia separada. Objetos Preference na tela inicial podem se vincular a subtelas que contenham preferências relacionadas.

A Figura 2 mostra uma hierarquia simples que contém duas categorias: Messages e Sync.

Imagem que mostra uma tela de preferências com hierarquias
Figura 2. Uma hierarquia simples com duas categorias.

A Figura 3 mostra o mesmo conjunto de preferências dividido em várias telas:

Imagem que mostra uma hierarquia dividida em várias telas
Figura 3. Uma hierarquia dividida em várias telas.

Para vincular telas com um Preference, declare um app:fragment em XML ou use Preference.setFragment(). Inicia o nome completo do pacote do PreferenceFragmentCompat quando o Preference é tocado, conforme mostrado no exemplo a seguir.

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

Quando um usuário toca em um Preference com um Fragment associado, o método de interface PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment() é chamado. Esse método é onde você processa a exibição da nova tela e onde a tela é implementada no Activity circundante.

Uma implementação típica é semelhante a esta:

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

Não é mais possível declarar hierarquias aninhadas no mesmo recurso XML usando um &lt;PreferenceScreen&gt; aninhado. Use objetos Fragment aninhados.

Usar atividades separadas

Como alternativa, se precisar personalizar muito cada tela ou se quiser transições completas de Activity entre telas, use um Activity separado para cada PreferenceFragmentCompat. Ao fazer isso, é possível personalizar totalmente cada Activity e a tela de configurações correspondente. Para a maioria dos apps, não recomendamos isso. Em vez disso, use Fragments conforme descrito anteriormente.

Para saber mais sobre como iniciar uma Activity usando uma Preference, consulte Ações de preferência.