🚀 3.10 Preferências e Configurações

O Android oferece um ecossistema robusto para persistir pequenas configurações do usuário através da API SharedPreferences. Para a interface de usuário, utilizamos o componente moderno PreferenceFragmentCompat da biblioteca AndroidX.

Implementando a Tela de Configurações

Diferente de layouts comuns, as telas de preferências são definidas em um arquivo XML específico no diretório res/xml/preferencias.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
 
    <PreferenceCategory app:title="Geral">
        <SwitchPreferenceCompat
            app:key="modo_viagem"
            app:title="Modo Viagem"
            app:summary="Ativa a seleção automática de viagens com base na data." />
 
        <EditTextPreference
            app:key="valor_limite"
            app:title="Valor Limite"
            app:useSimpleSummaryProvider="true"
            app:dialogTitle="Informe o limite (%)" />
    </PreferenceCategory>
</PreferenceScreen>

O Fragmento de Preferências (AndroidX)

No Android Studio 2023.1, herdamos de PreferenceFragmentCompat:

public class ConfiguracoesActivity extends AppCompatActivity {
 
    @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settings_activity);
        
        getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.settings_container, new SettingsFragment())
            .commit();
    }
 
    public static class SettingsFragment extends PreferenceFragmentCompat {
        @Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.preferencias, rootKey);
        }
    }
}

Persistência Manual com SharedPreferences

Para funcionalidades como “Manter Conectado”, utilizamos o acesso direto ao arquivo de preferências da atividade:

// Na BoaViagemActivity.java (Login)
private void salvarLogin(boolean manterConectado) {
    var preferencias = getPreferences(MODE_PRIVATE);
    var editor = preferencias.edit();
    
    editor.putBoolean("manter_conectado", manterConectado);
    editor.apply(); // Moderno: apply() é assíncrono e mais performático que commit()
}
 
private boolean verificarLogin() {
    var preferencias = getPreferences(MODE_PRIVATE);
    return preferencias.getBoolean("manter_conectado", false);
}

IMPORTANT

Apply vs Commit: O método commit() grava os dados de forma síncrona, o que pode causar travamentos na UI. O método apply() grava de forma assíncrona em background, sendo a escolha correta para operações em dispositivos móveis.

3.11 Conclusão do Módulo

Chegamos ao final do módulo de Interface e Layouts! Aqui aprendemos:

  1. Como organizar telas com ConstraintLayout, LinearLayout e TableLayout.
  2. Interatividade com ViewBinding e Java 17.
  3. Uso de DialogFragments para diálogos estáveis.
  4. Exibição de listas dinâmicas com ListView e SimpleAdapter.
  5. Persistência de configurações com SharedPreferences.

No próximo capítulo, entraremos na Persistência de Dados Profissional, utilizando o Room Persistence Library para gerenciar bancos de dados SQLite de forma moderna.


⬅️ Capítulo Anterior | Próximo Capítulo ➡️