PreferenceActivity更新摘要

我有一个PreferenceActivity的2级树的PreferenceScreen ,如下所示:

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

每个较低级别的优选屏幕,例如A和B,正在收集两个相关的数据片段。 我想这些父项的摘要是两个子偏好的当前值的组合。

我尝试在叶子首选项上添加onPreferenceChangeListener,并从那里更新摘要,但是似乎并不需要。 首选项都是在活动中以编程方式创build的,所以我在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; } }); 

然后,我试图find一个位置,可以通知我已经从子页面返回到最高级别首选项屏幕,以便我可以在此处进行更新。 不过,我很困惑如何显示较低级别的屏幕。 看起来他们实际上是对话,而不是完整的活动,因为onPause / onResume在它们之间移动时不会被调用。 是否有某种方法,我错过了将返回到顶级页面时将被调用?

我也尝试添加sharedPreferenceChangeListener,如此处所述,但似乎永远不会被调用。

任何人有什么我在这里失踪的提示,或者我失踪的任何更简单的方法?

Solutions Collecting From Web of "PreferenceActivity更新摘要"

我有同样的问题,似乎调用summary.onContentChanged()后更正纠正我的问题。

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

使用下面的代码并覆盖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(); } } 

希望能帮助到你。

我也面临这个问题,我终于find了一个解决scheme,通过使用来自监听器的值。 在下面的例子中(对于ListPreference),我首先获取ListPreference数组中的值的索引,然后使用此索引检索值的标签:

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

这个小技巧效果很好,我发现了很多不同的可能的解决scheme,但只有这个为我工作。

经过一个真正的反复试验之后,我终于在另一个答案中find了答案 。 这是神奇的线路:

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

把它放在你喜欢的听众那里,那么你就很好。