我正在制作一个简单的预算跟踪应用程序。我有一个 Budget 类,它存储一些变量:预算的金额、持续时间和初始值。我在 fragment 中只有一个全局预算对象,称为“预算”,并且正在尝试将其保存。它似乎保存得很好,但是当我尝试检索它时,它由于某种原因返回默认值。这是我的保存和加载方法。我只在onCreateView中调用getBudget(),并且只在onResume()中以及编辑预算后调用saveBudget。请注意日志条目。
public void saveBudget(){
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.clear();
Gson gson = new Gson();
String json = gson.toJson(budget);
Log.d("BTAG", "JSON: " + json);
editor.putString("current budget", json);
editor.commit();
}
public Budget getBudget(){
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPref.getString("current budget", null);
Log.d("BTAG", "gson from json: " + gson.fromJson(json, Budget.class));
return gson.fromJson(json, Budget.class);
}
我的日志显示了我当前的预算实例:
D/BTAG: JSON: {"amount":35.92,"frequency":"monthly","originalAmount":35.92}
D/BTAG: gson from json: null
这表明它保存没有问题,但加载不起作用。为什么 getBudget() 不起作用?
最佳答案
我认为问题可能出在:
only call
saveBudget
inonResume()
- 您必须在应用关闭时保存预算,而不是在
onResume()
中。 Check this Android Activity Lifecycle . - 此外,我认为您不应该使用硬编码字符串作为 key 。尝试使用字符串资源,如Android docs 。如果“key”输入错误,您将获得默认值。
- 如果您节省预算,然后将其加载到另一个 Activity 中,则问题可能出在获取
SharedPreferences
实例上。要获取SharedPreferences
,请使用:
SharedPreferences sP = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences from different activity
你可以试试这个,我希望它能编译:
public static final String SHARED_PREFS = "NAME_OF_SP";
public static final String NAME_OF_VAL = "budget";
public void saveBudget()
{
SharedPreferences sharedPref = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
Gson gson = new Gson();
String json = gson.toJson(budget);
Log.d("BTAG", "JSON: " + json);
editor.putString(NAME_OF_VAL, json);
editor.apply();
}
public Budget getBudget()
{
SharedPreferences sharedPref = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPref.getString(NAME_OF_VAL, null);
Log.d("BTAG", "gson from json: " + gson.fromJson(json, Budget.class));
return gson.fromJson(json, Budget.class);
}
关于java - SharedPreferences 始终返回自定义对象的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62922086/