La nouvelle insistance sur les fragments au lieu des activités semble rendre cela plus difficile. La route invalidate
n'a pas semblé fonctionner ni les approches utilisant la vue sous-jacente. Grâce à la réponse de Halxinate, j'ai réussi à travailler avec ça. Pour les personnes qui sont aussi nouveau que je suis à tout cela voici quelques détails:
Lors de la création du fragment de paramètres, enregistrez une référence dans votre activité principale, par exemple:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
switch (item.getItemId()) {
case R.id.action_preferences:
if (getFragmentManager().getBackStackEntryCount() < 1) {
FragmentTransaction trans = getFragmentManager()
.beginTransaction();
// Save a reference to the settings fragment
settingsFrag = new SettingsFragment();
trans.replace(R.id.container, settingsFrag);
trans.addToBackStack(null);
trans.commit();
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Puis, quand vous voulez pour mettre à jour les résumés de l'PreferenceScreen
extérieur du OnSharedPreferenceChangeListener
utiliser ce genre de chose. Notez que vous devez avoir défini une clé dans votre fragment préférence xml pour la PreferenceScreen
externe (dans ce cas android:key="prefs_root"
):
public static void setOuterSummaries(SettingsFragment sf) {
// Set the outer preferences summaries
if (sf == null)
return;
//Code to update the summaries....
// Force the parent screen summaries to update
prefScr = (PreferenceScreen) sf.findPreference("prefs_root");
if (prefScr != null)
((BaseAdapter) prefScr.getRootAdapter()).notifyDataSetChanged();
}
OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs,
String key) {
Log.e("L", "Change");
setOuterSummaries(settingsFrag);
}
};
Notez que vous pouvez enregistrer une référence à la BaseAdapter
au lieu de fragment de paramètres mais L'approche semble plus sûre lorsque vous pensez à la généraliser à une situation ou un code à plusieurs fragments qui crée dynamiquement le contenu du fragment.
Une chose à noter, que si la préférence d'intérêt est lui-même 'CheckBoxPreference' (ou tout autre' TwoStatePreference', comme 'SwitchPreference'), puis' setSummary' doesn ne fonctionne pas si 'android: summaryOn' ou' android: summaryOff' a été assigné. On devrait utiliser 'setSummaryOn' et' setSummaryOff' dans un tel cas, ce qui n'est pas évident à mon humble avis. – Stan