やりたいこと
ユーザーの入力(EditText)を永続化し、アプリ起動のたびに初期化されないようにしたい。
開発環境
- macOS 10.15.5
- Android Studio 4.0
- Kotlin 1.3.72
SharedPreferencesとは?
SharedPreferences とは、boolean, float, int, long, string などのデータ型について、キーと値のペアを読み書きできるAPI。キーと値のペアは内部ストレージにxmlファイルとして保存される。初回アクセス以降はメモリ上に展開されたキャッシュからデータを取得するため、高速にアクセスできる。
API名「SharedPreferences」から誤解されることもあるが、厳密には「ユーザー設定」を保存するためのものではなく、ユーザーのハイスコアなどの単純なデータを保存する際に使われる。↓ デベロッパーガイドより
注: SharedPreferences API は Key-Value ペアの読み書き用であり、アプリ設定向けのユーザー インターフェースを作成するための Preference API と混同しないように注意してください(ただし、後者もユーザー設定の保存には SharedPreferences を使用します)。Preference API の詳細については、設定デベロッパー ガイドをご覧ください。
使い方
#####まず、次のいずれかのメソッドを呼び出し、SharedPreferences
オブジェクトを取得する。
-
getSharedPreferences()
アプリの任意のContextから呼び出せる。 -
getPreferences()
一つのActivityに対してプリファレンスファイルを一つだけ使用する必要がある場合に、Activityからこのメソッドを使用する。
val sharedPref = getSharedPreferences("プリファレンスファイル名", Context.MODE_PRIVATE)
*第二引数はファイルの共有モードでContext MODE_PRIVATE
は他のアプリとデータを共有しない設定。↓他のモードについては非推奨になっているそうです。(デベロッパーガイドより)
注: MODE_WORLD_READABLE モードと MODE_WORLD_WRITEABLE モードは、API レベル 17 でサポートが終了しています。Android 7.0(API レベル 24)以降は、サポートが終了したモードを使用すると SecurityException がスローされます。アプリ専用のファイルを他のアプリと共有する必要がある場合は、FileProvider を使用して FLAG_GRANT_READ_URI_PERMISSION を指定してください。 詳細については、ファイルを共有するをご覧ください。
ファイルへの書き込み
-
SharedPreferences.edit()
メソッドでEditorを作成 -
putInt()
やputString()
を呼び出し、Key-Valueを渡す -
apply()
またはcommit()
を呼び出して、変更内容を保存
sharedPref.edit().putString("key名", inputText).apply()
*apply()
は非同期、commit()
は同期的にディスクに書き込む。
ファイルから読み取る
-
getInt()
やgetString()
を呼び出し、値に対応するキーを指定する - 必要に応じて、キーが存在しない場合に返すデフォルト値を指定する
val savedText = sharedPref.getString("key名", "デフォルト文字列")
サンプルコード
レポジトリはこちら。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// getSharedPreferencesメソッドでSharedPreferencesオブジェクトを取得
val sharedPref = getSharedPreferences("プリファレンスファイル名", Context.MODE_PRIVATE)
// getString()を呼び出して保存されている文字列を読み込む
// まだ保存されていない場合はデフォルトの文字列を返す
val savedText = sharedPref.getString("key名", "デフォルト文字列")
val editText = findViewById<EditText>(R.id.editText)
editText.setText(savedText)
val button = findViewById<Button>(R.id.saveButton)
button.setOnClickListener {
// テキストボックスに入力されている文字列を取得
val inputText = editText.text.toString()
// プリファレンスに書き込む
sharedPref.edit().putString("key名", inputText).apply()
}
}
xmlファイルが実際に保存されている場所の確認
AndroidStudio の Device File Explorerから確認できます。(詳しくはこちら)
参考
- デベロッパーガイド
- みんなのプログラミング
- 書籍(Amazonのリンク)