我遇到了一个有点奇怪的SharedPreferences问题。
我有一个Activity,它在ViewPager中包含一个片段。该片段显示图标和文本。您可以从其他活动更改此片段中显示的图标(复选标记或交叉,默认选中标记)和文本。
现在我想保存文本和所选图标,因此片段显示的文本和图标相同,即使您关闭应用程序并稍后重新启动它也是如此。
所以我尝试使用SharedPreferences实现这一点,但是当我尝试它时,我的片段显示没有文本,虽然我设置了默认值,图标始终是十字架,无论之前是什么,虽然默认图标应该是复选标记。
我使用用户在之前的活动中输入的数据创建了片段的onActivityCreated()
中的值。
保存:
SharedPreferences sharedPref = getActivity().getApplicationContext().getSharedPreferences("com.fragmentdata.myapp", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
//Here I am getting the values I want to save from a bundle, city and country...
editor.putString("savedCity", city);
editor.putString("savedCountry", country);
editor.putString("fragmentSaved", "yes");
editor.apply();
然后,我获取了包含片段的活动的onCreate()
中的值:
SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("com.fragmentdata.myapp", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
//adding fragment that was created with user input
String ifAdded = sharedPref.getString("addedFragment", "no");
if(ifAdded.equalsIgnoreCase("yes")){
Bundle extras = getIntent().getExtras();
StatusFragment newFragment = new StatusFragment();
newFragment.setArguments(extras);
mSectionsPagerAdapter.addFragment(newFragment, extras.getString("city"));
editor.putString("addedFragment", "no");
editor.apply();
}
//Adding a saved fragment after restart
String storedSave = sharedPref.getString("fragmentSaved", "no");
if (storedSave.equalsIgnoreCase("yes")){
String storedCity = sharedPref.getString("savedCity", "somecity");
String storedCountry = sharedPref.getString("savedCountry", "somecountry");
Bundle saves = new Bundle();
StatusFragment savedFragment = new StatusFragment();
saves.putString("city", storedCity);
saves.putString("country", storedCity);
savedFragment.setArguments(saves);
mSectionsPagerAdapter.addFragment(savedFragment, saves.getString("city"));
}
在创建片段数据的活动中,我有:
SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("com.fragmentdata.myapp", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("addedFragment", "yes");
editor.apply();
fragmentHolder.putExtras(bundle);
startActivity(fragmentHolder);
bundle
包含用户输入的值,fragmentHolder
是保存该片段的活动。
我在stackoverflow上搜索了不同问题的答案,但是没有一个能为我工作,例如:
Cannot get value from sharedpreferences
Shared Preferences get lost after shutting down device or killing the app
Shared Preferences reset data when app is force closed or device is restarted
SharedPreferences return only default value
SharedPreferences return only default value
Shared preference always taking default value
SharedPreferences keep getting default value
很抱歉,如果我这可能是微不足道的事情,但我没有使用Fragments,我现在第一次使用SharedPreferences。
我会很感激每一个有用的答案。
答案 0 :(得分:1)
问题现在解决了。我不得不使用getActivity().getApplicationContext().getSharedPreferences("com.fragmentdata.myapp", Activity.MODE_PRIVATE);
,我的一些变量在捆绑和首选项中混淆了。我纠正了这个,现在它工作正常:)谢谢你的答案。
答案 1 :(得分:0)
您正在混淆存储在SharedPreference
和应用程序资源(strings.xml
)中的内容
editor.putString(getString(R.string.pref_fragment_saved), "Yes");
此行将字符串保存在您的首选项XML中,但之后您尝试将其读取为
getResources().getString(R.string.pref_fragment_saved).equals("Yes")
实际上只是从R.string.pref_fragment_save
strings.xml
阅读你保存的内容的正确方法是
getActivity().getPreferences(Context.MODE_PRIVATE).getString(getResources().getString(R.string.pref_fragment_saved), "defaultValue")
或者说有点清洁:
SharedPreferences prefs = getActivity().getPreferences(Context.MODE_PRIVATE);
String key_frag_saved = getResources().getString(R.string.pref_fragment_saved);
String storedString = prefs.getString(key_frag_saved, "defValue");
if ( storedString.equalsIgnoreCase("yes") ) {...}
与从SharedPreference
对象实例中读取其他已保存值的方法相同。
答案 2 :(得分:-1)
你想用这个
SharedPreferences sharedPref = ...;
extras.putString("city", sharedPref.getString(getResources().getString(R.string.pref_saved_city), ""));
您的onCreate
方法中的