🚀 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étodoapply()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:
- Como organizar telas com ConstraintLayout, LinearLayout e TableLayout.
- Interatividade com ViewBinding e Java 17.
- Uso de DialogFragments para diálogos estáveis.
- Exibição de listas dinâmicas com ListView e SimpleAdapter.
- 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.