2010-03-07 23 views
13

En mi aplicación de Android tengo un padre PreferenceScreen que tiene 3 CheckBoxPreferences como niños.PreferenceScreen android: resumen de actualización!

Cuando pulso en el padre PREFERENCE, y se muestran las 3 casillas de verificación, selecciono uno de ellos, y en el Preference.OnPreferenceChangeListener ASOCIADA con las casillas de verificación que puse Resumen PREFERENCE de los padres con:

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

El Lo que pasa es que cuando regreso al padre, su resumen no se actualiza, incluso si internamente el valor ha cambiado correspondientemente al valor establecido.

¿Alguien tiene alguna idea con respecto a este comportamiento?

+0

Una cosa a tener en cuenta, que si la preferencia de interés es en sí 'CheckBoxPreference' (u otro' TwoStatePreference', como 'SwitchPreference'), entonces' setSummary' doesn No funciona si se ha asignado 'android: summaryOn' o' android: summaryOff'. Uno debería usar 'setSummaryOn' y' setSummaryOff' en tal caso, lo cual no es obvio. – Stan

Respuesta

1

descubrí que parece que funciona mediante el seguimiento de setSummary() con getListView().invalidate()

12

Uso

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

funciona como un encanto y se puede utilizar sin tener en cuenta el lugar de cambiar el resumen.

+0

Si las pantallas están anidadas dentro de otras pantallas, esto debería hacerse en la pantalla principal inmediata. –

0

La nueva insistencia en fragmentos en lugar de actividades parece hacer esto más difícil. La ruta invalidate no pareció funcionar ni se acerca utilizando la Vista subyacente. Gracias a la respuesta de halxinate ahora he logrado trabajar en esto. Para las personas que son tan nuevos como yo de todo esto que aquí están algunos detalles más:

Al crear el fragmento de configuración, guardar una referencia en su actividad principal, por ejemplo:

@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); 
    } 
} 

Entonces, cuando usted quiere para actualizar los resúmenes del PreferenceScreen externo desde el OnSharedPreferenceChangeListener use este tipo de cosas. Tenga en cuenta que es necesario haber definido una clave en su preferencia xml fragmento para el exterior PreferenceScreen (en este caso 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); 
    } 
}; 

Tenga en cuenta que usted podría ahorrar una referencia a la BaseAdapter en lugar de al fragmento de configuración pero esto el enfoque parece más seguro cuando se piensa en generalizarlo a una situación o código de múltiples fragmentos que crea dinámicamente el contenido del fragmento.

1

Esta es la forma correcta

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; 
    } 
}); 
Cuestiones relacionadas