[英]Android: onSharedPreferenceChanged does not change a summary of PreferenceScreen
[英]PreferenceScreen android:summary update !
在我的Android應用程序中,我有一個PreferenceScreen
父級,它有3個CheckBoxPreferences
作為子級。
當我單擊父首選項屏幕,並顯示3個復選框時,我選擇其中一個,並在與復選框相關的Preference.OnPreferenceChangeListener中,我將父設置的preferenceScreen摘要設置為:
Parent.setSummary("string depending on the selection")
問題是,當我返回到父級時,它的摘要不會更新,即使內部值已相應地更改為設置的值。
有沒有人對這種行為有任何想法?
采用
Parent.setSummary("string depending on the selection");
((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();
像魅力一樣工作,無論你改變總結的地方都可以使用。
這是正確的方法
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;
}
});
我發現它似乎通過使用getListView().invalidate()
跟進setSummary()
來工作setSummary()
getListView().invalidate()
您可以在父PreferenceScreen
上使用BaseAdapter.notifyDataSetChanged()
來更新UI
。 請參閱此處以獲取示例代碼: 從(子)PreferenceScreen返回時更新PreferenceActivity中的現有Preference項
如果您使用支持偏好而不是去:
findPreference("your_preference").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object o) {
getListView().getAdapter().notifyDataSetChanged();
return true;
}
});
對片段而不是活動的新堅持似乎使這更難。 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);
}
}
然后,當您想要從OnSharedPreferenceChangeListener
更新外部PreferenceScreen
的摘要時, OnSharedPreferenceChangeListener
使用此類內容。 請注意,您需要在首選項片段xml中為外部PreferenceScreen
定義一個鍵(在本例中為android:key="prefs_root"
):
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
的引用而不是對設置片段的引用,但是當您考慮將其概括為多片段情況或動態創建片段內容的代碼時,此方法似乎更安全。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.