PreferenceFragmentを使って設定情報をアプリ内で共有する

はじめに

設定画面を作るのにPreferenceFragmentを利用しています。 PreferenceFragmentで設定した項目を別のビューでも使う方法が分からなかったので残しておきます。

注意

本記事中のKotlinのコードはKotlin Android Extensionsを利用した記述のため素のKotlinとは書き方が異なる可能性があります。 ご注意ください。

SharedPreferenceの名前を変更する

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    preferenceManager.sharedPreferencesName = $PREFERENCE_NAME$
    addPreferenceFromResource(R.xml.hoge)
}

ポイントはonCreatePreferencesの最初の行。 sharedPreferencesNameを使ってSharedPreferenceの名前を独自のものに変更します。 これによりPreferenceFragment以外のビューからでもSharedPreferenceを参照できるようになります。

Preferenceを保存する

PreferenceFragmentで項目を準備している場合は能動的に保存せずとも自動的に保存されます。 保存の際に使われるKeyはPreferenceFragmentのxmlで各項目に設定したKeyが利用されます。

Preferenceを読み込む

PreferenceFragmentの場合

ListPreferenceを利用した一例

val preference = findPreference($KEY$) as ListPreference
preference.entry?.let {
    preference.summary = "$it"
}

preferenceのentryをgetするとすでに読み込まれているので、それを表示する処理を書いてあげれば良い。

その他のビュー

val sharedPreference = context.getSharedPreferences($PREFERENCE_NAME$, Context.MODE_PRIVATE)
val preference = preference.getString($KEY$, "")

まずgetSharedPreferencesを利用してsharedPreferenceを取得する。 getSharedPreferencesの第一引数はsharedPreferenceの名前をStringで入力、第二引数はsharedPreferenceのモードでMODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE, MODE_MULTI_PROCESSから用途に合ったモードを選択する。 詳しくはリファレンスを参照。

次に取得したsharedPreferenceから保存した値を取り出す。 preference.getHoge()で保存した型に合わせたメソッドを利用して取り出す。 取り出した値を使いたいところで使えば良い。

おわりに

SharedPreferenceの名前を変更する、ここに辿りつくまでが一番大変でした。 ともあれ、これでPreferenceFragment以外からも設定項目を取り出すことが出来ました。

逆にPreferenceFragment以外から項目を設定できる気がします。 今後利用するはずなので、検証したら追記か新しい記事を作成しようと思います。

参考

android - PreferenceFragmentで任意のSharedPreferencesを使いたい - スタック・オーバーフロー