Android 개발에 익숙하지 않고 공유 환경 설정 개념을 사용하여 버튼 값을 저장하는 첫 번째 Android 앱을 개발 중입니다.Android에서 Shared Preferecne 로직 관련 문제
내 요구 사항 :
앱을 설치 이후 난생 처음 열, 버튼을 사용자가 클릭 및 타이머 선택기 대화 상자가 열립니다. 사용자가 원하는 시간을 선택하고 '확인'버튼을 클릭합니다. '확인'버튼을 클릭하면 사용자가 선택한 시간이 버튼 자체의 텍스트로 설정됩니다. 이제 버튼은 사용자가 설정 한 시간을 표시합니다. 사용자가 처음부터 앱을 열 때마다이 값을 사용할 수 있기를 바랍니다.
버튼 값을 저장하기 위해 공유 환경 설정을 사용하고 있습니다. 따라서 사용자가 처음부터 주 활동을 열 때마다 단추는 이전에 사용자가 선택한 시간 값을 표시합니다.
아래 코드에서 필자는 갖고있는 지식과 공유 환경 설정을 구현했으며 앱을 실행 해 보았습니다. 앱을 처음 열면 기본 활동에서 시간 값을 설정하고 해당 시간이 버튼에 올바르게 표시됩니다.
문제에 직면 : 나는 (정지()에서) 뒤로 버튼을 누르거나 최근 애플 리케이션 버튼을 눌렀을 때 메모리에서 응용 프로그램을 제거하면 (에가 파괴()) 다시, 내 응용 프로그램을 열
버튼의 시간 값은 이전에 사용자가 선택한대로 사용할 수 있습니다. 이제 시간을 설정하지 않고 앱을 닫고 앱을 다시 열면 이전에 표시된 값이 기본 텍스트 (예 : '시간 설정')로 바뀝니다. 시간을 설정하지 않고 앱을 닫을 때 문제가 발생합니다. 앱을 다시 열면 버튼의 값이 재설정됩니다.
공유 기본 설정이 두 번째 이후부터 제대로 작동하지 않는 이유를 이해할 수 없습니다.
누군가 아래의 코드를 수정하는 데 도움을주십시오. 미리 감사드립니다 :)
참고 : 클래스 및 레이아웃 xml 파일에 대한 가져 오기는 아래에 포함되어 있지 않습니다.
내 코드 :
public class MainActivity extends Activity implements OnClickListener {
SharedPreferences storedata;
public static final String filename = "StoredData";
Button ATfrom;
int ATfromHour;
int ATfromMinute;
static long ATfrom_to_millisec;
String Active_From_Time;
String SP_Active_From_Time = null;
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
storedata = getSharedPreferences(filename, 0);
SharedPreferences.Editor editor = storedata.edit();
editor.putString("Active_From_Time", Active_From_Time);
editor.commit();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
storedata = getSharedPreferences(filename, 0);
SharedPreferences.Editor editor = storedata.edit();
editor.putString("Active_From_Time", Active_From_Time);
editor.commit();
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
storedata = getSharedPreferences(filename, 0);
SP_Active_From_Time = storedata.getString("Active_From_Time", "Set time");
ATfrom.setText(SP_Active_From_Time);
}
@Override
protected void onResume() {
super.onResume();
storedata = getSharedPreferences(filename, 0);
SP_Active_From_Time = storedata.getString("Active_From_Time", "Set time");
ATfrom.setText(SP_Active_From_Time);
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
storedata = getSharedPreferences(filename, 0);
SP_Active_From_Time = storedata.getString("Active_From_Time", "Set time");
ATfrom.setText(SP_Active_From_Time);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ATfrom = (Button) findViewById(R.id.ATfrom);
ATfrom.setOnClickListener(this);
//calling shared preference to get the value of the button ATfrom
storedata = getSharedPreferences(filename, 0);
SP_Active_From_Time = storedata.getString("Active_From_Time", "Set time");
ATfrom.setText(SP_Active_From_Time);
}
@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
String statetosave = ATfrom.getText().toString();
savedInstanceState.putString("saved_state", statetosave);
super.onSaveInstanceState(savedInstanceState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
String statesaved = savedInstanceState.getString("saved_state");
ATfrom.setText(statesaved);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.ATfrom:
final Calendar ATfromC = Calendar.getInstance();
ATfromHour = ATfromC.get(Calendar.HOUR_OF_DAY);
ATfromMinute = ATfromC.get(Calendar.MINUTE);
// Launch Time Picker Dialog
TimePickerDialog ATfromtpd = new TimePickerDialog(MainActivity.this,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
String AM_PM;
if (hourOfDay < 12) {
AM_PM = "AM";
} else {
AM_PM = "PM";
if (hourOfDay > 12) {
hourOfDay = hourOfDay - 12;
}
}
if (minute < 10) {
ATfrom.setText(hourOfDay + ":0" + minute + " " + AM_PM);
} else {
ATfrom.setText(hourOfDay + ":" + minute + " " + AM_PM);
}
//Converting time to string for shared preference
Active_From_Time = ATfrom.getText().toString();
ATfrom_to_millisec = (ATfromHour * 60 * 60 * 1000) + (ATfromMinute * 60 * 1000);
}
}, ATfromHour, ATfromMinute, false);
ATfromtpd.show();
break;
}
}
}
논리가 공유 환경 설정을 저장하는 데 사용한 논리가 잘못되었습니다. 활동을 두 번째로 실행하는 동안 (즉, 시간을 설정 한 후 즉각적인 실행) Active_From_Time의 값은 null이며 onDestroy/OnStop 콜백에 저장됩니다. 나는 일단 시간이 onTimeSet() 안에 선택된 공유 환경 설정에 시간 값을 저장하고 u가 한 것처럼 onCreate의 공유 환경 설정에서 값을 가져 오도록 제안합니다. –
'onStop'과'onDestroy'에서 값을 공유 환경 설정에 저장하지 않습니다. 이것들은 –
때문에 무시됩니다.Ramesh와 Vivek를 명확히 해 주셔서 감사합니다 :) –