Android - How to use SharedPreferences in non-Activity class?

后端 未结 12 2377
日久生厌
日久生厌 2020-12-13 08:54

How do you use SharedPreferences in a non-Activity class? I tried making a generic Preferences utility class and importing android.content.Context but Eclipse s

12条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-13 09:18

    In Kotlin, there's a nice & simple wrapper-based solution – just copy & paste the code into a new AppPreferences.kt file and follow the 4 TODO steps outlined in the code:

    import android.content.Context
    import android.content.Context.MODE_PRIVATE
    import android.content.SharedPreferences
    import androidx.core.content.edit
    
    object AppPreferences {
        private var sharedPreferences: SharedPreferences? = null
    
        // TODO step 1: call `AppPreferences.setup(applicationContext)` in your MainActivity's `onCreate` method
        fun setup(context: Context) {
            // TODO step 2: set your app name here
            sharedPreferences = context.getSharedPreferences(".sharedprefs", MODE_PRIVATE)
        }
    
        // TODO step 4: replace these example attributes with your stored values
        var heightInCentimeters: Int?
            get() = Key.HEIGHT.getInt()
            set(value) = Key.HEIGHT.setInt(value)
    
        var birthdayInMilliseconds: Long?
            get() = Key.BIRTHDAY.getLong()
            set(value) = Key.BIRTHDAY.setLong(value)
    
        private enum class Key {
            HEIGHT, BIRTHDAY; // TODO step 3: replace these cases with your stored values keys
    
            fun getBoolean(): Boolean? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getBoolean(name, false) else null
            fun getFloat(): Float? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getFloat(name, 0f) else null
            fun getInt(): Int? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getInt(name, 0) else null
            fun getLong(): Long? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getLong(name, 0) else null
            fun getString(): String? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getString(name, "") else null
    
            fun setBoolean(value: Boolean?) = value?.let { sharedPreferences!!.edit { putBoolean(name, value) } } ?: remove()
            fun setFloat(value: Float?) = value?.let { sharedPreferences!!.edit { putFloat(name, value) } } ?: remove()
            fun setInt(value: Int?) = value?.let { sharedPreferences!!.edit { putInt(name, value) } } ?: remove()
            fun setLong(value: Long?) = value?.let { sharedPreferences!!.edit { putLong(name, value) } } ?: remove()
            fun setString(value: String?) = value?.let { sharedPreferences!!.edit { putString(name, value) } } ?: remove()
    
            fun remove() = sharedPreferences!!.edit { remove(name) }
        }
    }
    

    Now from anywhere within your app you can get a value like this:

    val heightInCentimeters: Int? = AppPreferences.heightInCentimeters
    val heightOrDefault: Int = AppPreferences.heightInCentimeters ?: 170
    

    Setting a value to the SharedPreferences is just as easy:

    AppPreferences.heightInCentimeters = 160 // sets a new value
    

提交回复
热议问题