Sobes.tech
Junior

Android uygulamasında tema ayarlarını nasıl kaydedip kullanabilirsiniz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Etkin bir yaklaşım, seçilen temayı kaydetmek için SharedPreferences kullanmayı ve uygulamak için AppCompatDelegate.setDefaultNightMode() kullanmayı içerir.

  1. Temayı kaydetme: Seçilen tema kimliğini (örneğin, "light", "dark", "system") saklamak için SharedPreferences kullanın.

    // SharedPreferences alın
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    // Düzenleyici alın
    val editor = sharedPrefs.edit()
    // themeId ile temayı uygulayın
    editor.putString("current_theme", themeId)
    // Değişiklikleri kaydet
    editor.apply()
    
  2. Başlangıçta temayı uygulama: Ana Activity veya Application sınıfında, kaydedilen değeri SharedPreferences'den okuyun ve temayı uygulayın.

    // Kaydedilen tema değerini okuyun
    val themeId = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
        .getString("current_theme", "system") // Varsayılan 'system'
    
    // Temayı uygulayın
    when (themeId) {
        "light" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
        "dark" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
        "system" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
        else -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
    }
    
  3. Kullanıcı tarafından tema değişikliği: Kullanıcı arayüzü sağlayın (örneğin, ayarlarda RadioButton), burada kullanıcı temayı seçebilir. Seçim yapıldığında, yeni kimliği SharedPreferences'e kaydedin ve hemen AppCompatDelegate.setDefaultNightMode() çağırarak temayı uygulayın ve gerekirse Activity'yi yeniden başlatın.

    // Farz edelim ki kullanıcı koyu temayı seçti
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    val editor = sharedPrefs.edit()
    editor.putString("current_theme", "dark")
    editor.apply()
    
    // Temayı hemen uygulayın
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
    // Veya tam tema uygulaması için recreate() kullanın
    // recreate()
    

recreate() ile Activity'yi yeniden başlatmak, mevcut Activity içindeki tüm View'lerin yeni tema ile doğru şekilde yeniden çizilmesi için gerekebilir.

  1. styles.xml içinde temaları tanımlama: res/values/styles.xml ve res/values-night/styles.xml dosyalarında açık ve koyu temalar için stiller tanımlayın ve Theme.AppCompat temalarından türetin.

    <!-- res/values/styles.xml -->
    <style name="AppTheme.Light" parent="Theme.AppCompat.Light">
        <!-- Açık tema için stil tanımlamaları -->
    </style>
    
    <!-- res/values-night/styles.xml -->
    <style name="AppTheme.Dark" parent="Theme.AppCompat">
        <!-- Koyu tema için stil tanımlamaları -->
    </style>
    

Uygulamanın temel temasını AndroidManifest.xml içinde belirtin:

```xml
<!-- AndroidManifest.xml -->
<application
    android:theme="@style/AppTheme.Light"
    ...>
    <!-- ... Activities -->
</application>
```
  1. Tema değişikliklerini izleme: Sistem teması değiştiğinde (örneğin, zamanlamaya göre veya telefon ayarlarıyla manuel), onConfigurationChanged() içinde Configuration.uiMode kullanarak tepki verebilirsiniz, ancak AppCompatDelegate genellikle MODE_NIGHT_FOLLOW_SYSTEM kullanıldığında otomatik olarak bunu yönetir.

    @Override
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        // Gerekirse yeni temayı kontrol edebilirsiniz
        // val currentNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
        // ...
    }
    

AppCompatDelegate kullanımı, Android'de temaları desteklemek için önerilen yaklaşımdır çünkü geri uyumluluk sağlar ve destek kitaplığıyla çeşitli bileşenlerin düzgün çalışmasını temin eder.