對片段而不是活動的新堅持似乎使這更難。 invalidate
路由似乎沒有工作,也沒有使用底層View的方法。感謝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
的摘要使用這種事情。請注意,您需要在您的偏好片段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
,而不是將設置片段但這方法似乎更安全,當你想到將其推廣到多片段情況或動態創建片段內容的代碼時。
有一點要注意,如果感興趣的偏好本身就是'CheckBoxPreference'(或其他'TwoStatePreference',如'SwitchPreference'),然後'setSummary'沒有按如果分配了android:summaryOn或android:summaryOff,則不起作用。在這種情況下,應該使用'setSummaryOn'和'setSummaryOff',這不是明顯的imho。 – Stan 2015-06-27 12:52:21