2010-03-07 4 views
13

Dans mon application android j'ai un parent PreferenceScreen qui a 3 CheckBoxPreferences comme enfants.PreferenceScreen android: mise à jour du résumé!

Lorsque je clique sur le parent PREFERENCE, et les 3 cases à cocher sont affichés, je choisis l'un d'entre eux, et dans la Preference.OnPreferenceChangeListener associée unique avec les cases à cocher I ensemble résumé PREFERENCE du parent avec:

Parent.setSummary("string depending on the selection") 

Le chose est que lorsque je reviens au parent, son résumé n'est pas mis à jour, même si en interne la valeur a changé en conséquence à la valeur définie.

Quelqu'un a-t-il une idée à propos de ce comportement?

+0

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

Répondre

1

j'ai découvert qu'il semble fonctionner en assurant le suivi setSummary() avec getListView().invalidate()

12

Utilisez

Parent.setSummary("string depending on the selection"); 
((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged(); 

fonctionne comme un charme et peut être utilisé quel que soit l'endroit où vous modifiez le résumé.

+0

Si les écrans sont imbriqués dans d'autres écrans, cela doit être fait sur l'écran parent immédiat. –

0

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.

1

Ceci est la bonne façon

Preference pref = findPreference(getString(R.string.key_of_pref)); 
PreferenceScreen parent = (PreferenceScreen) sf.findPreference(getString(R.string.key_of_preference_screen)); 
pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
    @Override 
    public boolean onPreferenceChange(Preference preference, Object newValue) { 
     boolean newValueBool = (Boolean) newValue; 
     parent.setSummary(newValueBool ? "Summary is true" : "Summary is false");             
     ((BaseAdapter) getPreferenceScreen().getRootAdapter()).notifyDataSetChanged(); 
     // true to update the state of the Preference with the new value 
     // in case you want to disallow the change return false 
     return true; 
    } 
});