Sobes.tech
Middle

Android uygulamasında tema ayarlarını nasıl kaydedip uygularız?

sobes.tech yapay zeka

AI'dan gelen yanıt

Bir Android uygulamasında tema ayarlarını kaydetmek ve uygulamak için birkaç yaklaşım kullanılabilir.

  1. SharedPreferences: Seçilen tema kimliğini gibi küçük veri miktarlarını kaydetmek için basit bir yöntem.

    // Temayı kaydet
    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
    with (sharedPref.edit()) {
        putInt(getString(R.string.saved_theme_key), themeId)
        apply()
    }
    
    // Temayı oku
    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
    
    // Activity'de temayı uygula
    setTheme(savedThemeId)
    super.onCreate(savedInstanceState)
    
  2. DataStore: Daha modern ve asenkron bir yöntem olup, veri akışları ve daha güvenilir depolama sağlar.

    // DataStore
    private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
    
    // Temayı kaydet
    suspend fun saveTheme(themeId: Int) {
        dataStore.edit { settings ->
            settings[intPreferencesKey("theme_id")] = themeId
        }
    }
    
    // Temayı al
    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
        }
    

    Tema uygulaması Activity'de, DataStore'dan alınan değeri (örneğin, collect kullanılarak coroutine içinde) aldıktan sonra ve setTheme çağrısı yapıldıktan sonra gerçekleşebilir. Temayı değiştirdikten sonra Resource'ların doğru yüklenmesi için Activity'nin yeniden oluşturulması gerekebilir.

  3. Sistem tema ayarları: Android, ayrıca yerleşik tema desteği sağlar: açık, koyu ve varsayılan (sistem ayarlarını takip eder). Bu, kaynaklar aracılığıyla uygulanabilir.

    • Açık ve koyu tema için stiller oluşturun (res/values/themes.xml ve res/values-night/themes.xml).
    • AppCompatDelegate.setDefaultNightMode kullanarak temayı programatik olarak uygulayın veya android:theme ile manifestte ayarlayın.

Bir temanın uygulanması genellikle Resource'ların doğru yüklenmesi için Activity'nin yeniden oluşturulmasını gerektirir. Bunu recreate() kullanarak yapabilirsiniz.