如何在Kotlin中设置一个值的首选项?

下面的代码是关于Kotlin的一个示例项目,我可以使用Code 1来获取一个共享偏好的值,但是我可以设置一个共享偏好的值吗?

我在示例项目中找不到这些代码,可以告诉我该怎么办? 谢谢!

代码1

class SettingsActivity : AppCompatActivity() { companion object { val ZIP_CODE = "zipCode" val DEFAULT_ZIP = 94043L } var zipCode: Long by DelegatesExt.preference(this, ZIP_CODE, DEFAULT_ZIP) } 

代码2

 object DelegatesExt { fun <T> notNullSingleValue() = NotNullSingleValueVar<T>() fun <T> preference(context: Context, name: String, default: T) = Preference(context, name, default) } class NotNullSingleValueVar<T> { private var value: T? = null operator fun getValue(thisRef: Any?, property: KProperty<*>): T { return value ?: throw IllegalStateException("${property.name} not initialized") } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { this.value = if (this.value == null) value else throw IllegalStateException("${property.name} already initialized") } } class Preference<T>(val context: Context, val name: String, val default: T) { val prefs: SharedPreferences by lazy { context.getSharedPreferences("default", Context.MODE_PRIVATE) } operator fun getValue(thisRef: Any?, property: KProperty<*>): T { return findPreference(name, default) } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { putPreference(name, value) } @Suppress("UNCHECKED_CAST") private fun findPreference(name: String, default: T): T = with(prefs) { val res: Any = when (default) { is Long -> getLong(name, default) is String -> getString(name, default) is Int -> getInt(name, default) is Boolean -> getBoolean(name, default) is Float -> getFloat(name, default) else -> throw IllegalArgumentException("This type can be saved into Preferences") } res as T } private fun putPreference(name: String, value: T) = with(prefs.edit()) { when (value) { is Long -> putLong(name, value) is String -> putString(name, value) is Int -> putInt(name, value) is Boolean -> putBoolean(name, value) is Float -> putFloat(name, value) else -> throw IllegalArgumentException("This type can't be saved into Preferences") }.apply() } } 

和更多

如果putPreference函数是public的,我可以使用下面的代码来设置共享首选项的值,但是它很丑

 class SettingsActivity : AppCompatActivity() { companion object { val ZIP_CODE = "zipCode" val DEFAULT_ZIP = 94043L } DelegatesExt.Preference(this, ZIP_CODE, DEFAULT_ZIP).putPreference( ZIP_CODE,"99999L"); } 

这就是operator fun setValue的用途:你只是写

 activity.zipCode = 1L 

(其中activity是一个SettingsActivity )或者

 zipCode = 1L 

(在SettingsActivity或扩展它的类),它会调用putPreference("zipCode", 1L) setValue(activity, activity::zipCode, 1L) putPreference("zipCode", 1L) 。 有关更多信息,请参阅https://kotlinlang.org/docs/reference/delegated-properties.html