我是Android开发的新手,我正在开发我的第一个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;
}
}
}
答案 0 :(得分:1)
不需要onStop和onDestroy方法。删除onStop和onDestroy并更新您的点击监听器,如下所示:
@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);
storedata = getSharedPreferences(filename, 0);
SharedPreferences.Editor editor = storedata.edit();
editor.putString("Active_From_Time", Active_From_Time);
editor.commit();
}
}, ATfromHour, ATfromMinute, false);
ATfromtpd.show();
break;
}
}
每次启动应用程序并退出Active_From_Time值时,都会覆盖并以共享首选项更新。
快乐编码!!!