Sobes.tech
Junior

Hogyan mentse el és használja a téma beállításokat egy Android alkalmazásban?

sobes.tech MI

Válasz az MI-től

Hatékony megközelítés magában foglalja a SharedPreferences használatát a kiválasztott téma mentéséhez és az AppCompatDelegate.setDefaultNightMode() alkalmazásához.

  1. Téma mentése: Használja a SharedPreferences-t a kiválasztott téma azonosítójának (pl. "light", "dark", "system") tárolására.

    // SharedPreferences elérése
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    // Szerkesztő elérése
    val editor = sharedPrefs.edit()
    // Téma alkalmazása ID-vel
    editor.putString("current_theme", themeId)
    // Változások mentése
    editor.apply()
    
  2. Téma alkalmazása indításkor: A fő Activity-ben vagy Application osztályban olvassa be a mentett értéket, és alkalmazza a témát.

    // Mentett téma érték olvasása
    val themeId = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
        .getString("current_theme", "system") // Alapértelmezett 'system'
    
    // Téma alkalmazása
    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. Felhasználói által történő téma váltás: Nyújtson felhasználói felületet (pl. RadioButton a beállításokban), ahol a felhasználó kiválaszthatja a témát. A kiválasztáskor mentse az új azonosítót a SharedPreferences-be, és azonnal alkalmazza a témát, meghívva az AppCompatDelegate.setDefaultNightMode()-t, és szükség esetén indítsa újra az Activity-t a helyes alkalmazáshoz.

    // Feltételezve, hogy a felhasználó kiválasztotta a sötét témát
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    val editor = sharedPrefs.edit()
    editor.putString("current_theme", "dark")
    editor.apply()
    
    // A téma azonnali alkalmazása
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
    // Vagy recreate() a teljes téma alkalmazásához
    // recreate()
    

    Az Activity újraindítása recreate()-tel szükséges lehet, hogy az összes View a jelenlegi Activity-ben helyesen frissüljön az új témával.

  4. Témák meghatározása a styles.xml-ben: Definiáljon stílusokat a világos és sötét témákhoz a res/values/styles.xml és res/values-night/styles.xml fájlokban, öröklődve a Theme.AppCompat-től.

    <!-- res/values/styles.xml -->
    <style name="AppTheme.Light" parent="Theme.AppCompat.Light">
        <!-- Világos téma stílusdefiníciók -->
    </style>
    
    <!-- res/values-night/styles.xml -->
    <style name="AppTheme.Dark" parent="Theme.AppCompat">
        <!-- Sötét téma stílusdefiníciók -->
    </style>
    

    Az AndroidManifest.xml-ben adja meg az alkalmazás alapértelmezett témáját:

    <!-- AndroidManifest.xml -->
    <application
        android:theme="@style/AppTheme.Light"
        ...>
        <!-- ... Activities -->
    </application>
    
  5. Téma változásának figyelése: Ha a téma rendszer szintű változik (pl. időzítés szerint vagy manuálisan a telefon beállításaiból), akkor az onConfigurationChanged()-ben a Configuration.uiMode-t használhatja a reagáláshoz, de az AppCompatDelegate általában automatikusan kezeli ezt a MODE_NIGHT_FOLLOW_SYSTEM használatakor.

    @Override
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        // Ellenőrizheti az új témát, ha szükséges
        // val currentNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
        // ...
    }
    

Az AppCompatDelegate használata ajánlott megközelítés az Android témák támogatására, mivel biztosítja a visszamenőleges kompatibilitást és a helyes működést a támogatási könyvtár különböző komponenseivel.