我知道,这个问题已在很多线程中处理过,但我无法弄清楚这一点。 所以我设置了这样的共享偏好:
SharedPreferences prefs = MainActivity.this.getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putStringSet(spinnerName, myValueSet );
editor.apply();
我读了这样的偏好:
SharedPreferences prefs = MainActivity.this.getPreferences(MODE_PRIVATE);
Set<String> spinnerValuesSet = null;
spinnerValuesSet = prefs.getStringSet(spinnerName,null );
一切正常,除了我的更改在此活动运行时可见,即 - 我显示SharedPreferences中的值,允许用户删除或添加然后更新ListView。这有效,但在我重新启动应用程序后,我得到了初始值。 这是我的方法从列表中删除一个值,更新SharedPreferences中的值并更新ListView
Button btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
SharedPreferences prefs = MainActivity.this.getPreferences(MODE_PRIVATE);
Set<String> spinnerValuesSet = prefs.getStringSet(spinnerName,null );
for (String s : spinnerValuesSet)
{
if(s == currentSelectedItemString)
{
spinnerValuesSet.remove(s);
SharedPreferences.Editor editor = prefs.edit();
editor.putStringSet(spinnerName, spinnerValuesSet );
editor.apply();
break;
}
}
updateListValues();
}
});
这是更新ListView的方法:
private void updateListValues()
{
SharedPreferences prefs = MainActivity.this.getPreferences(MODE_PRIVATE);
Set<String> spinnerValuesSet = prefs.getStringSet(spinnerName,null );
if(spinnerValuesSet.size() > 0)
{
names = new ArrayList<String>();
names.clear();
int k=0;
for (String s : spinnerValuesSet) {
names.add(k, s);
k++;
}
namesAA = new ArrayAdapter<String> ( this, android.R.layout.simple_list_item_activated_1, names );
myList.setAdapter(namesAA);
}
}
非常感谢任何帮助。
答案 0 :(得分:9)
SharedPreferences的各种get方法返回的对象应该被视为不可变的。请参阅SharedPreferences Class Overview以供参考。
您必须通过remove(String)
返回的SharedPreferences.Editor
致电SharedPreferences.edit()
,而不是直接致电SharedPreferences.getStringSet(String, Set<String>)
返回的套装。
每次都需要构建一个包含更新内容的新字符串集,因为当您想要更新其内容时,必须从SharedPreferences中删除Set条目。
答案 1 :(得分:2)
出现问题是因为SharedPreference返回的Set是不可变的。 https://code.google.com/p/android/issues/detail?id=27801
我通过创建一个新的Set实例并存储从SharedPreferences返回的所有值来解决这个问题。
//Set<String> address_ids = ids from Shared Preferences...
//Create a new instance and store everything there.
Set<String> all_address_ids = new HashSet<String>();
all_address_ids.addAll(address_ids);
现在使用新实例将更新推送回SharedPreferences
答案 2 :(得分:0)
我可能错了,但我认为您检索共享首选项的方式就是问题所在。尝试使用
SharedPreferences prefs = getSharedPreferences("appPreferenceKey", Context.Mode_Private);
答案 3 :(得分:0)
使用editor.commit();
代替editor.apply();
示例代码:
SharedPreferences prefs = MainActivity.this.getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putStringSet(spinnerName, myValueSet );
editor.commit();
我希望这会有所帮助。
答案 4 :(得分:0)
根据操作系统构建,您可能需要以不同的方式保存值。
boolean apply = Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD;
public static void saveValue(SharedPreferences.Editor editor)
{
if(apply) {
editor.apply();
} else {
editor.commit();
}
}