2014-04-13 7 views
0

나는 여전히 내 발을 안드로이드에 젖게하고 있습니다. 나는 기본 "학기"를 표현하기 위해 계절과 해를 저장하려고 노력하고 있지만 변경 사항이 적용되지 않습니다. 나는 기록하고 나의 settings.edit().putInt() 계산서가 나가 예상하고 있던 가치에서 두는 것을 시도하고 있다는 것을 확인했다.SharedPreferences가 업데이트되지 않습니다.

그러나 화면을 다시로드하면 기본 설정 값이 제공된 기본 값을 사용하고 있습니다. 왜 내 가치관을 잡지 못하는 걸까요? 감사.

공용 클래스 SetSemester이 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(); 
    } 

} 

}

답변

7

문제는이 3 문에 있습니다

settings.edit().putInt(year_key, year); 
settings.edit().putInt(season_key, season); 
settings.edit().apply(); 

SharedPrefences edit 방법은 새로운 에디터를 돌려줍니다. 이 Editor에서 수행 된 모든 작업은 메모리에 유지되고 apply 메소드가 호출 될 때만 파일에 저장됩니다. 따라서 edit()가 호출 될 때마다 조작은 새로 작성된 편집기에서 수행됩니다.

다음 코드로 3 줄 이상 교체,이 문제를 극복하기 위해 :

SharedPreferences.Editor edit = settings.edit(); 
edit.putInt(year_key, year); 
edit.putInt(season_key, season); 
edit.apply(); 
+0

대단히 감사합니다! 이것은 트릭을했다. 그리고 지금 나는 뭔가를 배웠습니다. – NSouth

관련 문제