在我的Android应用程序中,我有一个PreferenceScreen
个父母,其中有3个CheckBoxPreferences
作为孩子。
当我单击父首选项屏幕,并显示3个复选框时,我选择其中一个,并在与复选框相关联的Preference.OnPreferenceChangeListener中,我将父设置的preferenceScreen摘要设置为:
Parent.setSummary("string depending on the selection")
问题是,当我返回到父级时,它的摘要不会更新,即使内部值已相应地更改为设置的值。
有没有人对这种行为有任何想法?
答案 0 :(得分:13)
使用
Parent.setSummary("string depending on the selection");
((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();
就像魅力一样,无论您更改摘要的位置都可以使用。
答案 1 :(得分:1)
我发现通过跟setSummary()
getListView().invalidate()
似乎有效
答案 2 :(得分:1)
您可以在父BaseAdapter.notifyDataSetChanged()
上使用PreferenceScreen
来更新UI
。请参阅此处代码:Update existing Preference-item in a PreferenceActivity upon returning from a (sub)PreferenceScreen
答案 3 :(得分:1)
这是正确的方法
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;
}
});
答案 4 :(得分:1)
如果您要使用支持偏好设置而不是:
findPreference("your_preference").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object o) {
getListView().getAdapter().notifyDataSetChanged();
return true;
}
});
答案 5 :(得分:0)
对片段而不是活动的新坚持似乎使这更难。 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);
}
}
然后,如果要从PreferenceScreen
更新外部OnSharedPreferenceChangeListener
的摘要,请使用此类内容。请注意,您需要在外部PreferenceScreen
(在本例中为android:key="prefs_root"
)的首选项片段xml中定义一个键:
public static void setOuterSummaries(SettingsFragment sf) {
// Set the outer preferences summaries
if (sf == null)
return;
//Code to update the summaries....
// Force the parent screen summaries to update
prefScr = (PreferenceScreen) sf.findPreference("prefs_root");
if (prefScr != null)
((BaseAdapter) prefScr.getRootAdapter()).notifyDataSetChanged();
}
OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs,
String key) {
Log.e("L", "Change");
setOuterSummaries(settingsFrag);
}
};
请注意,您可以保存对BaseAdapter
的引用而不是对设置片段的引用,但是当您考虑将其概括为多片段情况或动态创建片段内容的代码时,此方法似乎更安全。 / p>