Sobes.tech
Middle

¿Cómo guardar y aplicar la configuración del tema en una aplicación de Android?

sobes.tech AI

Respuesta de la IA

Para guardar y aplicar la configuración del tema en una aplicación de Android, se pueden usar varios enfoques.

  1. SharedPreferences: Método sencillo para guardar una pequeña cantidad de datos, como el identificador del tema seleccionado.

    // Guardar tema
    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
    with (sharedPref.edit()) {
        putInt(getString(R.string.saved_theme_key), themeId)
        apply()
    }
    
    // Leer 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 en la Activity
    setTheme(savedThemeId)
    super.onCreate(savedInstanceState)
    
  2. DataStore: Método más moderno y asíncrono para guardar datos, que ofrece flujos de datos y un almacenamiento más confiable.

    // 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
        }
    }
    
    // Obtener 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
        }
    

    La aplicación del tema en la Activity puede realizarse después de obtener el valor de DataStore (por ejemplo, usando collect en una coroutine) y llamando a setTheme. Es posible que sea necesario recrear la Activity después de cambiar el tema para que se muestren correctamente los recursos.

  3. Configuraciones del sistema para el tema: Android también ofrece soporte integrado para temas: claro, oscuro y por defecto (que sigue la configuración del sistema). Esto se puede implementar mediante recursos.

    • Crear estilos para temas claros y oscuros (por ejemplo, res/values/themes.xml y res/values-night/themes.xml).
    • Configurar AppCompatDelegate.setDefaultNightMode para aplicar el tema programáticamente o en el manifiesto de la activity mediante android:theme.

Aplicar un tema a menudo requiere recrear la Activity para que los recursos se carguen correctamente. Para ello, se puede usar recreate().