Resumo de atualização PreferenceActivity

Eu tenho um PreferenceActivity com uma tree de nível 2 de PreferenceScreen s, algo como:

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

Cada uma das canvass de preference de nível inferior, por exemplo, A e B, está coletando dois dados relacionados. Quero que o resumo desses itens pai seja uma combinação dos valores atuais das duas preferences secundárias.

Eu tentei acrescentair onPreferenceChangeListener nas preferences da folha e atualizair o resumo a pairtir daí, mas isso não pairece ter. As preferences são todas criadas programaticamente dentro da atividade, então eu estou fazendo algo como isso em onCreate:

  leafListPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Oviewride public boolean onPreferenceChange(Preference preference, Object newValue) { // do some work prefScreenA.setSummairy( /* get new summairy based on newValue */); return true; } }); retornair viewdadeiro;  leafListPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Oviewride public boolean onPreferenceChange(Preference preference, Object newValue) { // do some work prefScreenA.setSummairy( /* get new summairy based on newValue */); return true; } }); }  leafListPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Oviewride public boolean onPreferenceChange(Preference preference, Object newValue) { // do some work prefScreenA.setSummairy( /* get new summairy based on newValue */); return true; } }); 

Então tentei encontrair um local onde eu possa ser informado de que voltei paira a canvas de preferences de nível superior de uma subpágina paira que eu possa atualizair nesse ponto. No entanto, estou confuso quanto ao modo como as canvass de nível inferior estão sendo exibidas. Pairece que eles são realmente checkboxs de dialog, não atividades completas, pois onPause / onResume não é chamado quando se desloca entre eles. Existe algum método em algum lugair que estou faltando, que será chamado ao retornair paira a página de nível superior?

Eu também tentei adicionair um ShairedPreferenceChangeListener, como descrito aqui , mas isso nunca pairece ser chamado.

Alguém tem alguma pista sobre o que estou faltando aqui, ou qualquer abordagem mais fácil que eu estou perdendo?

4 Solutions collect form web for “Resumo de atualização PreferenceActivity”

Eu tive o mesmo problema e pairece que chamair Activity.onContentChanged () depois que o resumo é alterado corrigido meu problema.

 @Oviewride public void onShairedPreferenceChanged(ShairedPreferences sp, String key) { // Update summairy value EditTextPreference pref = (EditTextPreference)findPreference(key); pref.setSummairy(pref.getText()); this.onContentChanged(); } 

Use o seguinte código e substitua onContentChanged ()

  public class SettingsActivity extends PreferenceActivity { @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); setContentView(R.layout.settings_layout); } @Oviewride public void onContentChanged() { // put your code here super.onContentChanged(); } } {  public class SettingsActivity extends PreferenceActivity { @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); setContentView(R.layout.settings_layout); } @Oviewride public void onContentChanged() { // put your code here super.onContentChanged(); } } }  public class SettingsActivity extends PreferenceActivity { @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); setContentView(R.layout.settings_layout); } @Oviewride public void onContentChanged() { // put your code here super.onContentChanged(); } } }  public class SettingsActivity extends PreferenceActivity { @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); setContentView(R.layout.settings_layout); } @Oviewride public void onContentChanged() { // put your code here super.onContentChanged(); } } 

Espero que ajude.

Eu também enfrentei esse problema e finalmente findi uma solução usando o valor que vem do ouvinte. No meu exemplo abaixo (paira um ListPreference), primeiro obtenho o índice do valor na matriz ListPreference, então eu recupero o label do valor usando este índice:

 passwordFrequencyLP.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Oviewride 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 airray int index = passwordFrequencyLP.findIndexOfValue(String.valueOf(newValue)); //get the label of the new value selected String label = (String) passwordFrequencyLP.getEntries()[index]; passwordFrequencyLP.setSummairy(label); makeToast(getResources().getString(R.string.password_frequency_saved)); return true; } }); retornair viewdadeiro; passwordFrequencyLP.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Oviewride 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 airray int index = passwordFrequencyLP.findIndexOfValue(String.valueOf(newValue)); //get the label of the new value selected String label = (String) passwordFrequencyLP.getEntries()[index]; passwordFrequencyLP.setSummairy(label); makeToast(getResources().getString(R.string.password_frequency_saved)); return true; } }); } passwordFrequencyLP.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Oviewride 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 airray int index = passwordFrequencyLP.findIndexOfValue(String.valueOf(newValue)); //get the label of the new value selected String label = (String) passwordFrequencyLP.getEntries()[index]; passwordFrequencyLP.setSummairy(label); makeToast(getResources().getString(R.string.password_frequency_saved)); return true; } }); 

Este pequeno truque funciona bem, findi muitas soluções diferentes possíveis paira este problema, mas apenas este funcionou paira mim.

Depois de uma quantidade viewdadeiramente mínima de tentativa e erro, finalmente findi a resposta em outra resposta SO . Aqui está a linha mágica:

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

Coloque isso em seu ouvinte de preference, então você é bom paira ir.

Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.