我有一个PreferenceActivity
,其中包含PreferenceScreen
的2级树,例如:
<PreferenceScreen>
<PreferenceScreen android:key="A">
<ListPreference/>
<EditTextPreference/>
</PreferenceScreen>
<PreferenceScreen android:key="B">
<ListPreference/>
<EditTextPreference/>
</PreferenceScreen>
...
</PreferenceScreen>
每个较低级别的偏好屏幕,例如A和B,正在收集两个相关的数据。我希望这些父项的摘要是两个子首选项的当前值的组合。
我尝试在叶子首选项上添加onPreferenceChangeListener并从那里更新摘要,但似乎没有。首选项都是在活动中以编程方式创建的,所以我在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;
}
});
然后我尝试找到一个位置,我可以通知我已经从子页面返回到顶级首选项屏幕,以便我可以在此时更新。但是,我对如何显示下级屏幕感到困惑。看起来它们实际上是对话框,而不是完整的活动,因为onPause / onResume在它们之间移动时不会被调用。在返回顶级页面时,是否有一些我遗漏的方法会被调用?
我还尝试添加一个sharedPreferenceChangeListener,如here所述,但似乎永远不会被调用。
任何人都有任何关于我在这里缺少什么的提示,或者我错过的任何更简单的方法?
答案 0 :(得分:12)
我遇到了同样的问题,似乎在更改摘要后调用 Activity.onContentChanged()更正了我的问题。
@Override
public void onSharedPreferenceChanged(SharedPreferences sp, String key) {
// Update summary value
EditTextPreference pref = (EditTextPreference)findPreference(key);
pref.setSummary(pref.getText());
this.onContentChanged();
}
答案 1 :(得分:1)
经过真正无误的反复试验后,我终于在another SO answer中找到了答案。这是神奇的界限:
((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();
把它放在你的偏好听众中,然后你就可以了。
答案 2 :(得分:0)
使用以下代码并覆盖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();
}
}
希望它有所帮助。
答案 3 :(得分:0)
我也遇到了这个问题,我终于通过使用来自监听器的值找到了解决方案。 在下面的示例中(对于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;
}
});
这个小技巧很有效,我找到了很多不同的解决方案来解决这个问题,但只有这个解决了这个问题。