Sobes.tech
Middle

Como guardar e aplicar as configurações do tema numa aplicação Android?

sobes.tech IA

Resposta da IA

Para guardar e aplicar as configurações do tema numa aplicação Android, podem ser utilizados vários métodos.

  1. SharedPreferences: Método simples para guardar uma pequena quantidade de dados, como o identificador do tema selecionado.

    // Guardar tema
    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
    with (sharedPref.edit()) {
        putInt(getString(R.string.saved_theme_key), themeId)
        apply()
    }
    
    // Ler tema
    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)
    val defaultValue = resources.getInteger(R.integer.default_theme_id)
    val savedThemeId = sharedPref?.getInt(getString(R.string.saved_theme_key), defaultValue) ?: defaultValue
    
    // Aplicar tema na Activity
    setTheme(savedThemeId)
    super.onCreate(savedInstanceState)
    
  2. DataStore: Método mais moderno e assíncrono para guardar dados, que oferece fluxos de dados e armazenamento mais fiável.

    // DataStore
    private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
    
    // Guardar tema
    suspend fun saveTheme(themeId: Int) {
        dataStore.edit { settings ->
            settings[intPreferencesKey("theme_id")] = themeId
        }
    }
    
    // Obter tema
    val themeFlow: Flow<Int> = dataStore.data
        .catch { exception ->
            if (exception is IOException) {
                emit(emptyPreferences())
            } else {
                throw exception
            }
        }
        .map { preferences ->
            preferences[intPreferencesKey("theme_id")] ?: R.style.Theme_App
        }
    

    A aplicação do tema na Activity pode ocorrer após obter o valor do DataStore (por exemplo, usando collect numa coroutine) e chamando setTheme. Pode ser necessário recriar a Activity após alterar o tema para que os recursos sejam carregados corretamente.

  3. Configurações do sistema para o tema: O Android também oferece suporte integrado para temas: claro, escuro e padrão (que segue as configurações do sistema). Isto pode ser implementado através de recursos.

    • Criar estilos para temas claro e escuro (por exemplo, res/values/themes.xml e res/values-night/themes.xml).
    • Configurar AppCompatDelegate.setDefaultNightMode para aplicar o tema programaticamente ou no manifesto da activity através de android:theme.

A aplicação de um tema muitas vezes requer a recriação da Activity para que os recursos sejam carregados corretamente. Para isso, pode-se usar recreate().