【发布时间】:2016-09-01 11:09:35
【问题描述】:
我在 SharedPreferences 上遇到了一个奇怪的问题。
我有一个在 ViewPager 中保存 Fragment 的 Activity。该片段显示一个图标和文本。您可以从另一个活动更改此片段中显示的图标(复选标记或叉号,复选标记是默认值)和文本。
现在我想保存文本和选择的图标,因此片段会显示相同的文本和图标,即使您关闭应用程序并稍后重新启动它也是如此。
所以我尝试使用 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();
然后,我在我的 Activity 的 onCreate() 中获得了包含 Fragment 的值:
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。
我会很感激每一个有用的答案。
【问题讨论】:
-
您在哪里检索 sharedpreference 值???我看不到任何代码
-
这个条件应该做什么?
if(getResources().getString(R.string.pref_fragment_saved).equals("Yes")){你知道它将始终是true或false基于R.string.pref_fragment_saved在/values/strings.xml的值,在运行时不可更改。 -
我们如何在您的代码中访问像这样的共享首选项?
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); -
我认为我知道有两种方法可以让共享偏好访问
1.PreferenceManager.getDefaultSharedPreferences(this); 2.context.getSharedPrefernces(PREF_NAME,MODE) -
@Anil 了解如何在android dev docs 中查找内容,非常方便。
标签: android android-fragments sharedpreferences