Я новичок в разработке Android, и я разрабатываю свое первое приложение для Android, в котором я использую концепцию общих настроек для сохранения значения кнопки.Проблема с логикой Shared Preferecne в Android
Мое требование:
Когда приложение открыто в первый раз после установки, открывается пользователь нажимает на кнопку и диалоговое окно выбора таймера. Пользователь выбирает предпочтительное время и нажимает кнопку «ОК». После нажатия кнопки «ОК» время, выбранное пользователем, устанавливается как текст на самой кнопке. Таким образом, теперь кнопка отображает время, заданное пользователем. Я хочу, чтобы это значение было доступно, когда пользователь открывает приложение отдельно от первого раза.
Чтобы сохранить эту кнопку, я использую общие предпочтения. Следовательно, всякий раз, когда пользователь открывает основное действие, кроме первого раза, кнопка отображает значение времени, выбранного ранее пользователем.
В приведенном ниже коде я использовал общие предпочтения со знанием, которое у меня есть, и я попытался запустить свое приложение. Когда приложение открывается в первый раз, в основном действии я устанавливаю значение времени и это время отображается правильно на кнопке.
Проблема Столкнувшись:
Когда я нажимаю кнопку назад (On Stop()) или удалить приложение из памяти, нажав на кнопку Недавние приложения (On Destroy()) и откройте мое приложение снова, значение времени на кнопке доступно, как было выбрано пользователем ранее. Теперь, когда я закрываю приложение без установки времени и снова открываю приложение, кнопка, отображаемая ранее, заменяется текстом по умолчанию (т. Е. «Установить время»). Проблема в том, что я не устанавливаю время и закрываю приложение, значение в кнопке сбрасывается, когда приложение открывается снова.
Я не могу понять, почему общие предпочтения не работают должным образом со второго раза.
Кто-то, пожалуйста, помогите мне в исправлении приведенного ниже кода. Заранее спасибо :)
Примечание: Импорт для 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. я хотел бы предложить u, чтобы сохранить значение времени для общих предпочтений, как только время выбрано внутри onTimeSet(), и получить значение из общих настроек в onCreate, как вы это сделали. –
не сохраняют значения для общих настроек в 'onStop' и' onDestroy', они получают переопределение из-за этого –
Понятно.Спасибо за разъяснение Ramesh и Vivek :) –