首选屏幕android:摘要更新!
在我的android应用程序中,我有一个首选屏幕android:摘要更新!,android,Android,在我的android应用程序中,我有一个首选项屏幕父项,它有3个复选框首选项 当我单击父项首选项屏幕并显示3个复选框时,我选择其中一个,并在与复选框关联的Preference.OnPreferenceChangeListener中设置父项首选项屏幕摘要: Parent.setSummary("string depending on the selection") 问题是,当我返回到父级时,它的摘要不会更新,即使在内部,该值已相应地更改为设置的值 有人知道这种行为吗 我发现它似乎是通过使用get
首选项屏幕
父项,它有3个复选框首选项
当我单击父项首选项屏幕并显示3个复选框时,我选择其中一个,并在与复选框关联的Preference.OnPreferenceChangeListener中设置父项首选项屏幕摘要:
Parent.setSummary("string depending on the selection")
问题是,当我返回到父级时,它的摘要不会更新,即使在内部,该值已相应地更改为设置的值
有人知道这种行为吗 我发现它似乎是通过使用
getListView().invalidate()
跟踪setSummary()
来工作的。您可以使用父首选项屏幕上的BaseAdapter.notifyDataSetChanged()
来更新UI
。参见此处示例代码:使用
Parent.setSummary("string depending on the selection");
((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();
它就像一个符咒,无论你在什么地方更改摘要都可以使用。新的坚持碎片而不是活动似乎使这一点更加困难。invalidate
路由似乎不起作用,也无法使用底层视图。多亏了halxinate的回答,我现在已经设法解决了这个问题。对于像我这样对所有这些都不熟悉的人,这里有一些更多的细节:
创建设置片段时,请在主活动中保存引用,例如:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
switch (item.getItemId()) {
case R.id.action_preferences:
if (getFragmentManager().getBackStackEntryCount() < 1) {
FragmentTransaction trans = getFragmentManager()
.beginTransaction();
// Save a reference to the settings fragment
settingsFrag = new SettingsFragment();
trans.replace(R.id.container, settingsFrag);
trans.addToBackStack(null);
trans.commit();
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
请注意,您可以保存对BaseAdapter
的引用,而不是对设置片段的引用,但是当您考虑将其推广到动态创建片段内容的多片段情况或代码时,这种方法似乎更安全。这是正确的方法
Preference pref = findPreference(getString(R.string.key_of_pref));
PreferenceScreen parent = (PreferenceScreen) sf.findPreference(getString(R.string.key_of_preference_screen));
pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean newValueBool = (Boolean) newValue;
parent.setSummary(newValueBool ? "Summary is true" : "Summary is false");
((BaseAdapter) getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();
// true to update the state of the Preference with the new value
// in case you want to disallow the change return false
return true;
}
});
如果您使用的是支持首选项,而不是:
findPreference("your_preference").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object o) {
getListView().getAdapter().notifyDataSetChanged();
return true;
}
});
需要注意的一点是,如果感兴趣的首选项本身是CheckBoxPreference
(或其他TwoStatePreference
,例如SwitchPreference
),那么如果分配了android:summaryOn
或android:summaryOff
,则setSummary
不起作用。在这种情况下,应使用setSummaryOn
和setSummaryOff
,这在imho中并不明显。如果屏幕嵌套在其他屏幕中,则应在直接父屏幕上执行。
findPreference("your_preference").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object o) {
getListView().getAdapter().notifyDataSetChanged();
return true;
}
});