2011-01-11 12 views
7

Ho un PreferenceActivity con un albero 2 livello di PreferenceScreen s, qualcosa di simile a:PreferenceActivity sintesi aggiornamento

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

ciascuna delle schermate delle preferenze di livello inferiore, ad esempio, A e B, è la raccolta di due pezzi di dati correlati . Voglio che il sommario di quegli elementi padre sia una combinazione dei valori correnti delle due sub preferenze.

Ho provato ad aggiungere onPreferenceChangeListener sulle preferenze foglia e l'aggiornamento del riepilogo da lì, ma non sembra prendere. Le preferenze sono tutti creati a livello di codice all'interno della attività, in modo che sto facendo qualcosa di simile in 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; 
     } 
    }); 

Allora ho cercato di trovare una posizione in cui posso essere informato che sono tornato al top screen preferenze di livello da una sottopagina in modo che possa aggiornare a quel punto. Tuttavia, sono confuso su come vengono visualizzati gli schermi di livello inferiore. Sembra che siano in realtà dialoghi, non attività complete poiché onPause/onResume non viene chiamato quando ci si sposta tra di loro. C'è qualche metodo che mi manca verrà chiamato quando si torna alla pagina di primo livello?

Ho anche provato ad aggiungere un sharedPreferenceChangeListener, come descritto here, ma che sembra non essere mai chiamato.

Qualcuno ha qualche suggerimento su cosa mi manca qui, o un approccio più semplice mi manca?

risposta

11

Ho avuto lo stesso problema e sembra che chiamare Activity.onContentChanged() dopo che il riepilogo è stato modificato ha corretto il mio problema.

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

Grazie per il suggerimento. Ho smesso di lavorarci un po 'di tempo fa, ma proverò quando ne avrò l'occasione. –

+0

Purtroppo questo non ha funzionato per me. –

+0

ha funzionato alla grande, grazie – Yahia

0

utilizzare il seguente codice e sovrascrivere 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(); 
    } 

} 

Speranza che aiuta.

0

Ho anche affrontato questo problema e ho finalmente trovato una soluzione utilizzando il valore proveniente dall'ascoltatore. Nel mio esempio qui sotto (per un ListPreference), ho capito l'indice del valore nella matrice ListPreference, poi ho recuperare l'etichetta del valore con questo indice:

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

Questo piccolo trucco funziona bene, ho trovato molte diverse soluzioni possibili a questo problema, ma solo questo ha funzionato per me.

0

Dopo una quantità veramente incredibile di tentativi ed errori, ho finalmente trovato la risposta in another SO answer. Ecco la linea magica:

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

Metti questo nel tuo ascoltatore di preferenze, quindi sei a posto.

Problemi correlati