編集: 以下で説明する問題は、コーディング関連の問題が原因ではない、非常に特殊なデバイスの問題が原因でした。
多くのcheckBoxPreferencesがあるpreferenceActivityがあります。checkBoxPreferenceは、デフォルトの共有設定ファイルを保存し、UIを更新するためにアプリを開いたときに再度呼び出されることを想定しています。
これは、想定されているようには起こりません。アプリを閉じて元に戻すと、値は想定どおりのままになりますが、タスクマネージャーを使用してアプリを終了したり、電話の電源を入れ直したりすると(アプリが実行されていない場合)、defaultValuesが呼び出されます。また。
そこで、onResume()でSharedPreferenceを作成してテストしました。
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
次に、その共有設定にキーがあるかどうかを確認します。
pref.contains("myCheckBoxPreference");
閉じて開いて元に戻すと、trueが返されます。タスクマネージャーを閉じたり、電話の電源を入れ直したりすると、falseが返されます。
そこで、SharedPreferenceを手動で設定してみました
SharedPreferences.Editor editor = pref.edit();
editor.putBoolean("myCheckBoxPreference", myCheckBoxPreference.isChecked());
editor.commit();
そして、checkboxpreferenceの値が変わったときにそれを呼び出しました。また、onStopとonPauseで呼び出してみました。それでも、アプリを閉じて再度開くと、pref.containsはtrueを返しますが、電話の電源を入れ直してから再びオンにすると、falseを返します。
そこで、SharedPreferencesファイルを使用してみました。
クラス宣言では:
public static final String PREFS = "prefs";
そしてonResume()で:
SharedPreferences pref = this.getSharedPreferences(PREFS, 0);
同じ動作で、pref.containsは、アプリを閉じて再度開くとtrueを返しますが、電話の電源をオフにしてから再度オンにするとfalseを返します。
次に、myCheckBoxPreferenceのキー値をCheckBoxPreferenceのxmlキーと一致しないものに変更しようとしましたが、それでも同じ効果がありました。
そして、電話からアプリケーションをアンインストールし、電話の電源をオフにしてから再度オンにしてから再インストールしましたが、それでも同じ効果があります。