PreferenceFragment (actionBar の一部) をロードするメイン アクティビティがあります。
PreferenceFragment 内で、XML ファイルから設定を読み込みます。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
問題は、タブを変更した場合 (ActionBar によって管理されていることを思い出してください)、別のフラグメントの設定の 1 つを変更し、preferenceFragment に戻って更新されないことです。特に問題は、さまざまなフラグメントから、さらにはリモート呼び出しによっても変更できる SwitchPreference(true/false) です (その後、共有設定で設定が変更されます。はい、変更をコミットしました)。
さまざまな解決策を探しましたが、正直なところ、うまくいくものは見つかりませんでした。私自身の考えは次のとおりです。
スイッチの Switch 要素を取得できれば問題は解決するので、 onStart() または onResume() メソッドでスイッチを true に設定できます。しかし、Switch オブジェクトを取得するための変更はありますか? 通常のレイアウトをロードすると、次のようにスイッチにアクセスできます。
View v = inflater.inflate(R.layout.start_fragment, container, false);
Switch status = (Switch) v.findViewById(R.id.switch1);
その後、次のようにスイッチの位置を設定できます。
status.setChecked(true);
別の解決策は、実際のビューを破棄して addPreferencesFromResource() を再度呼び出すことですが、正直なところ、これを行う方法がわかりません....
3 番目の解決策は、PreferenceFragment で OnCheckedChangeListener を使用することですが、やはり問題はスイッチを変更/更新する方法です。
サービスの 1 つで OnSharedPreferenceChangeListener を実行していて、この問題をデバッグするために、リスナーに switchPreference のステータスを記録させたので、Preference が正しく更新されていると確信しています。
どうにかして助けてくれませんか?
残念ながら、明日の朝までに自分の質問に答えることができないので、質問を編集します。
ありがとうございます。基になるアクティビティを再開したくはありませんが、フラグメントのみを再開します。
幸いなことに、このスレッドで手がかりを見つけました: How do you refresh the PreferenceActivity to show changes in settings?
本当に簡単に SwitchPreference にアクセスできます。私の解決策は次のとおりです。
private SwitchPreference pref_phone_locked;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
status = (SwitchPreference) findPreference("status");
}
public void onStart(){
super.onStart();
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
if(sharedPref.getBoolean("status", false)){
status.setChecked(true);
}else{
status.setChecked(false);
}
}
このようにして、Preference を SwitchPreference にキャストし、onStart() 呼び出しのたびに変更するだけです。これが私の問題に対する最良の解決策だと思います。
うまくいけば、この答えが将来誰かの時間を節約するでしょう =) ありがとうございました!