<抽象クラス>
/**
* SharedPreferences抽象クラス
*/
@Suppress("UNCHECKED_CAST") //cast時のwarningを抑制
abstract class AbstractSharedPreferencesManager {
//SharedPreferencesインスタンス変数
protected abstract val preferencesName :String
protected abstract val spf : SharedPreferences
//setter/getter
protected fun <T : Any?> preference() = object :ReadWriteProperty<AbstractSharedPreferencesManager, T?>{
override fun setValue(
thisRef: AbstractSharedPreferencesManager,
property: KProperty<*>,
value: T?
) {
putData(property.name, value)
}
override fun getValue(
thisRef: AbstractSharedPreferencesManager,
property: KProperty<*>
): T? {
return spf.all[property.name] as? T?
}
}
// データをキーに応じて保存
protected fun <T : Any?> putData(key: String, value: T?) {
val editor = spf.edit()
when (value) {
is String -> editor.putString(key, value)
is Boolean -> editor.putBoolean(key, value)
is Float -> editor.putFloat(key, value)
is Int -> editor.putInt(key, value)
is Long -> editor.putLong(key, value)
null -> editor.remove(key)
else -> throw IllegalArgumentException("type mismatch")
}
editor.apply()
}
}
<実際にSharedPreferencesに書き込むクラス> SharedPreferenceの名前ごとに作ると色々できるんだぜ的な
**
* SharedPreference読み書きクラス
*/
class SharedPreferenceManager : AbstractSharedPreferencesManager() {
//インスタンスセット
override val preferencesName: String = "context"
override val spf: SharedPreferences = MyApplication.appContext.getSharedPreferences(preferencesName, Context.MODE_PRIVATE)
//staticメソッド
companion object {
private var instance :SharedPreferenceManager? = null
//インスタンス取得
fun getInstance() = instance ?: synchronized(this) {
instance ?: SharedPreferenceManager().also { instance = it }
}
//初期化
fun initialize() {
instance = SharedPreferenceManager()
}
}
//プロパティ
var testString :String? by preference()
var testInt :Int? by preference()
var testBoolean :Boolean? by preference()
var testFloat :Float? by preference()
var testLong :Long? by preference()
}
これで色んな名前のSharedPreferenceが作れるぜ的な。
使い方
何回も同じこと書くのは大変なのでapplyでまとめる。書き込み
SharedPreferenceManager.apply {
initialize()
getInstance().apply {
testString = "a"
testBoolean = true
testFloat = 0.0f
testInt = 1
testLong = 0
}
}
読み込み(ちゃんとapplyの外で変数宣言しないと切ないことになるよ)
SharedPreferenceManager.apply {
initialize()
getInstance().apply {
val s :String? = testString
val b :Boolean? = testBoolean
val f :Float? = testFloat
val i :Int? = testInt
var l :Long? = testLong
}
}
なんかもうちょいいいやり方ある気がする
Device File Manager> data/data/[パッケージ名]/shared_prefs内にある。
ファイルがないのにgetすると普通にnull返ってくる。