Reputation: 5276
I'm still getting my feet wet in android. I'm trying to save a season and year to represent a default "semester," but my changes aren't applying. I've logged and confirmed that my settings.edit().putInt()
statements are attempting to put in the values I'd expect.
But when I reload the screen I see that my preferences are using the supplied default value. Why are my values not taking? Thanks.
public class SetSemester extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_set_semester);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new SetSemesterFragment()).commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.set_semester, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class SetSemesterFragment extends Fragment {
View rootView;
SharedPreferences settings;
int YEAR_DEFAULT_VALUE = AddCourse.thisYear - AddCourse.baseYear;
int SEASON_DEFAULT_VALUE = 0;
String year_key;
String season_key;
static int baseYear=2005;
static int thisYear = Calendar.getInstance().get(Calendar.YEAR);
public SetSemesterFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_set_semester,
container, false);
year_key = getResources().getString(R.string.year_pref_str);
season_key = getResources().getString(R.string.season_pref_str);
Button b = (Button) rootView.findViewById(R.id.apply_semester_btn);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
applySemester(v);
}
});
settings = this.getActivity().getSharedPreferences(getResources().getString(R.string.main_prefs_file), 0);
int curYear = settings.getInt(year_key, YEAR_DEFAULT_VALUE);
int curSeason = settings.getInt(season_key, SEASON_DEFAULT_VALUE);
System.out.println("stored values..." + curYear + " " + curSeason);
//Year Spinner
ArrayList<String> years = new ArrayList<String>();
for (int i = baseYear; i <= 2030; i++)
{
years.add(Integer.toString(i));
}
ArrayAdapter<String> adapter_year = new ArrayAdapter<String>(this.getActivity(),
android.R.layout.simple_spinner_item, years);
Spinner spinYear = (Spinner)rootView.findViewById(R.id.year_spinner);
adapter_year.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinYear.setAdapter(adapter_year);
spinYear.setSelection(curYear);
//Semester Spinner
Spinner spinner = (Spinner) rootView.findViewById(R.id.semester_spinner);
// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter<CharSequence> adapter_spinner = ArrayAdapter.createFromResource(this.getActivity(),
R.array.semester_spinner, android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
adapter_spinner.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
spinner.setAdapter(adapter_spinner);
spinner.setSelection(curSeason);
return rootView;
}
public void applySemester(View v){
Spinner semesterSpin = (Spinner)rootView.findViewById(R.id.semester_spinner);
Spinner yearSpin = (Spinner)rootView.findViewById(R.id.year_spinner);
//ToStrings
int year = yearSpin.getSelectedItemPosition();
int season = semesterSpin.getSelectedItemPosition();
System.out.println(year + " " + season);
settings.edit().putInt(year_key, year);
settings.edit().putInt(season_key, season);
settings.edit().apply();
}
}
}
Upvotes: 0
Views: 3110
Reputation: 17615
Issue is in these 3 statements:
settings.edit().putInt(year_key, year);
settings.edit().putInt(season_key, season);
settings.edit().apply();
SharedPrefences edit method returns a new Editor. All operations performed on this Editor are retained in memory and saved to the file only when apply method is invoked. Hence every time edit() is invoked, operations are performed on the newly created Editor.
To overcome this issue, replace above 3 lines with following code:
SharedPreferences.Editor edit = settings.edit();
edit.putInt(year_key, year);
edit.putInt(season_key, season);
edit.apply();
Upvotes: 7