我再次發佈這個問題,因爲我上次沒有得到任何答案,我仍然沒有解決問題。Android:SharedPreferences沒有從PreferenceFragment更新
我有一個PreferenceScreen設置菜單,其中我在運行時創建了很多CheckBoxPreferences(將它們添加到「排除列表」預覽屏幕中)。我創造了他們沒有問題的,這裏的XML代碼下面,它的開頭爲:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen
android:key="exclusion_list_key"
android:title="Exclusion List"
android:persistent="true"
android:summary="" >
</PreferenceScreen>
</PreferenceScreen>
我在PreferenceFragment的onCreate方法創建的複選框,將其添加到「排除列表」 PreferenceScreen和工作正常。
我試圖將「排除列表」的摘要設置爲所有勾選的複選框標題的列表(因此,如果複選框被選中,它的名稱將被列在「排除列表「)。
在onCreate()方法中,摘要被正確設置,沒有問題。
但是在onPreferenceChanged()方法中,我將「排除列表」的摘要設置爲我創建的「摘要」字符串(它包含正確的值),但不會更新它!當我從複選框菜單中按回時,「排除列表」沒有更新的值。
最後幾行是感興趣的。我做了一些printlns,看看發生了什麼事情:
監聽器工作正常,當預期
我總結變種中包含什麼的預期
調用setSummary(摘要)運行後,將getSummary ()返回期望值(所以這意味着它設置正確)
但是,當我實際上按回來看到「排除列表」,它的總結實際上並沒有得到更新!
我錯過了什麼嗎?提前致謝!
參考的所有代碼:
public class Settings extends AppCompatActivity {
public static final String EXC_LIST_KEY = "exclusion_list_key";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
String summary = "";
//Create all the checkboxes inside of the PreferenceScreen
for (int i = 0; i < MainActivity.contactNames.length; i++) {
CheckBoxPreference checkbox = new CheckBoxPreference(getActivity());
checkbox.setTitle(MainActivity.contactNames[i][0]);
checkbox.setKey(MainActivity.contactNames[i][2]);
checkbox.setSummary(MainActivity.contactNames[i][1]);
checkbox.setDefaultValue(false);
((PreferenceScreen) findPreference(EXC_LIST_KEY)).addPreference(checkbox);
if (checkbox.isChecked()) {
summary = summary + checkbox.getTitle() + "\n";
}
}
findPreference(EXC_LIST_KEY).setSummary(summary);
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
//Checkbox keys all start with 'key_'
if (key.startsWith("key_")) {
String summary = "";
for (int i = 0; i < MainActivity.contactNames.length; i++) {
CheckBoxPreference checkbox = (CheckBoxPreference) findPreference(MainActivity.contactNames[i][2]);
if (checkbox.isChecked()) {
summary = summary + checkbox.getTitle() + "\n";
}
}
System.out.println("Summary I have: " + summary); //Correct summary is printed out
findPreference(EXC_LIST_KEY).setSummary(summary); //Isn't updating the value???
System.out.println("Summary system has: " + findPreference(EXC_LIST_KEY).getSummary()); //Correct summary is printed out
}
}
}
}
這沒有奏效 – user1429039