Вы можете решить эту проблему с помощью делегированных свойств .
Вот очень простой пример реализации для хранения только String
предпочтений:
class PreferencesDelegate(val context: Context, val key: String, val defaultValue: String = "") {
private val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return sharedPreferences.getString(key, defaultValue)
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
sharedPreferences.edit()
.putString(key, value)
.apply()
}
}
Вы можете использоватьэто Activity
следующим образом:
class MyActivity : AppCompatActivity() {
var pref by PreferencesDelegate(this, "key")
fun foo() {
pref = "test"
println(pref)
}
}
Или с дополнительной функцией расширения для более приятного синтаксиса:
fun Activity.preference(key: String, defaultValue: String = ""): PreferencesDelegate {
return PreferencesDelegate(this, key, defaultValue)
}
class MyActivity : AppCompatActivity() {
var pref by preference("key")
}
Есть люди, которые уже имеютболее хорошие реализации того же самого с делегатами.Посмотрите, например, эту запись в блоге, эту и эту библиотеку.Вероятно, есть еще много, много других.