2011-01-11 14 views
7

Tengo un PreferenceActivity con un árbol 2 nivel de PreferenceScreen s, algo así como:PreferenceActivity Resumen actualización

<PreferenceScreen> 
    <PreferenceScreen android:key="A"> 
    <ListPreference/> 
    <EditTextPreference/> 
    </PreferenceScreen> 
    <PreferenceScreen android:key="B"> 
    <ListPreference/> 
    <EditTextPreference/> 
    </PreferenceScreen> 
    ... 
</PreferenceScreen> 

Cada una de las pantallas de preferencias de nivel inferior, por ejemplo, A y B, está recogiendo dos piezas de datos relacionados . Quiero que el resumen de esos elementos principales sea una combinación de los valores actuales de las dos preferencias secundarias.

Traté de agregar en PEFAChangeListener's en las preferencias de la hoja y actualizando el resumen a partir de ahí, pero parece que no toma. Las preferencias son creados mediante programación dentro de la actividad, por lo que estoy haciendo algo como esto en onCreate:

leafListPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
       // do some work 
       prefScreenA.setSummary(/* get new summary based on newValue */); 
       return true; 
     } 
    }); 

Luego trató de encontrar un lugar donde pueda ser informado de que he vuelto a la pantalla de preferencias de primer nivel desde una subpágina para que pueda actualizar en ese punto. Sin embargo, no estoy seguro de cómo se muestran las pantallas de nivel inferior. Parece que en realidad son diálogos, no actividades completas, ya que onPause/onResume no se llama cuando se mueve entre ellos. ¿Hay algún método en algún lugar que me falta que se llamará cuando regrese a la página de nivel superior?

También intenté agregar un SharedPreferenceChangeListener, como se describe here, pero parece que nunca se llamará.

¿Alguien tiene alguna pista sobre lo que me falta aquí, o sobre algún enfoque más fácil que me falta?

Respuesta

11

que tenían el mismo problema y parece que llamar Activity.onContentChanged() después se cambia el resumen corregido mi problema.

@Override 
public void onSharedPreferenceChanged(SharedPreferences sp, String key) { 
    // Update summary value 
    EditTextPreference pref = (EditTextPreference)findPreference(key); 
    pref.setSummary(pref.getText()); 
    this.onContentChanged(); 
} 
+0

Gracias por la sugerencia. Dejé de trabajar en esto hace un tiempo, pero lo intentaré cuando tenga oportunidad. –

+0

Lamentablemente esto no funcionó para mí. –

+0

funcionó muy bien, gracias – Yahia

0

utilizar el siguiente código y anular onContentChanged()

public class SettingsActivity extends PreferenceActivity 
    { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.preferences); 
      setContentView(R.layout.settings_layout); 


      } 

@Override 
    public void onContentChanged() { 
     // put your code here 
     super.onContentChanged(); 
    } 

} 

espero que ayude.

0

También me enfrenté a este problema y finalmente encontré una solución utilizando el valor que proviene del oyente. En mi siguiente ejemplo (para un ListPreference), lo primero que sale el índice del valor de la matriz ListPreference, entonces recuperar la etiqueta del valor de uso de este índice:

passwordFrequencyLP.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      int newFrequency = Integer.valueOf(newValue.toString()); 

      prefs.edit().putInt("settings_key_password_frequency", newFrequency).commit(); 

      //get the index of the new value selected in the ListPreference array 
      int index = passwordFrequencyLP.findIndexOfValue(String.valueOf(newValue)); 
      //get the label of the new value selected 
      String label = (String) passwordFrequencyLP.getEntries()[index]; 

      passwordFrequencyLP.setSummary(label); 

      makeToast(getResources().getString(R.string.password_frequency_saved)); 
      return true; 
     } 
    }); 

Este pequeño truco funciona bien, Encontré muchas soluciones posibles para este problema, pero solo esta funcionó para mí.

0

Después de una cantidad realmente estúpida de prueba y error, finalmente encontré la respuesta en another SO answer. Aquí está la línea mágica:

((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged(); 

Pon eso en tu oyente de preferencia, entonces ya estás listo para empezar.