Android で SharedPreferences の設定値をリセットする


Android アプリで設定値を初期値に戻す「リセット」の機能を実現しようとして意外と苦労したので、いくつかの注意点について述べたいと思います。

setDefaultValues は、未設定のパラメータしか設定しない

PreferenceManager#setDefaultValues の最後のパラメータ(readAgain) の説明は以下のようになっています。

Whether to re-read the default values. If false, this method will set the default values only if this method has never been called in the past (or if the KEY_HAS_SET_DEFAULT_VALUES in the default value shared preferences file is false). To attempt to set the default values again bypassing this check, set readAgain to true.

初期値を再読み込みするかどうか。 false を指定すると、過去にこのメソッドが呼ばれていない場合(もしくは、共有設定ファイルの初期値の KEY_HAS_SET_DEFAULT_VALUES が false の場合)に限って、初期値を設定する。このチェックをバイパスして初期値を設定したい場合は、 readAgain を true に設定すること。

この記述からは、readAgain パラメータを true にして setDefaultValues を呼び出せば、設定値がリセットされるような気がしてしまうのですが、単純に

としただけでは、設定値をリセットする(元に戻す)ことはできません。

readAgain の説明をもう一度見てみると、以下の注意書きが追加されています。

Note: this will NOT reset preferences back to their default values. For that functionality, use getDefaultSharedPreferences(Context) and clear it followed by a call to this method with this parameter set to true.

注意: この値は、設定値を初期値にリセットしません。 そのようにするためには、 getDefaultSharedPreferences(Context) を使い、初期値をクリアしてからこのパラメータを true にしてこのメソッドを呼び出してください。

「setDefaultValues は初期値を読み込んで初期化するけれど、設定された値を上書きするわけではない。」ということです。未初期化のパラメータのみ初期値が読み込まれるので、一旦自前で初期化クリアする必要があります。

クリアしてから、setDefaultValues を実行する

具体的には、以下のようにします。

これで、設定値が初期値にリセットされます。

ただし、PreferenceActivity が表示された状態で上記コードを実行しても、PreferenceActivity が再描画されるわけではなく、「戻る」→「再度アクティビティ表示」をしないと値が変更されていることを確認できません。

アクティビティを再描画するには

PreferenceActivity 内にリセットボタンを配置した場合等、このままでは UI として不完全なので、アクティビティを再描画する方法が必要です。いろいろと調べたところ、java – refreshing views of Preferences when using PreferenceActivity – Stack Overflow で示されている方法でうまく動作することが分かりました。

その後、Activity#overridePendingTransition について自分なりに調べると、finish() や、startActivity() の後に置くのが正しいようで、動作を検証して FLAG_ACTIVITY_NO_ANIMATION の指定も不要なのを確認しました。結局、以下のコードを Activity (本記事では、PreferenceActivity) のメソッドとして作成し、上記の setDefaultValues 実行後に呼び出すことでうまく行くのが確認できました。

[参考にしたサイト]