Activity kill 后 setSingleChoiceItems 值不保留
setSingleChoiceItems value doesn't stick after Activity kill
大家好,祝大家新年快乐!
我的应用程序遇到了一个我似乎无法修复的奇怪问题。这应该是一个逻辑错误,但我无法以某种方式捕获它。
这是我的代码
public String[] str={"Disabled","Sound Quality Prefered","Bass Prefered","Battery Prefered",};
public int ThemePresetValue = 0;
private int SelectedThemePresetValue = 0;
public void presets() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setTitle("Select Your Sound Preset");
alertDialog.setNegativeButton("Cancel", null);
alertDialog.setPositiveButton("Select", themePresetDialogPositiveListener);
alertDialog.setSingleChoiceItems(str, ThemePresetValue, PresetListListener);
alertDialog.show();}
DialogInterface.OnClickListener PresetListListener =
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SelectedThemePresetValue = which;
}
};
DialogInterface.OnClickListener themePresetDialogPositiveListener =
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mPreset = "";
ThemePresetValue = SelectedThemePresetValue;
if (ThemePresetValue == 0) {
mPreset = "Disabled";
} else if (ThemePresetValue == 1) {
mPreset = "Sound Quality Prefered";
} else if (ThemePresetValue == 2) {
mPreset = "Bass Prefered";
} else if (ThemePresetValue == 3) {
mPreset = "Battery Prefered";
}
if (mPreset.equals("Disabled")) {
disabler();
} else if (mPreset.equals("Sound Quality Prefered")) {
SoundQPreset();
} else if (mPreset.equals("Bass Prefered")) {
bassPreset();
} else if (mPreset.equals("Battery Prefered")) {
batteryPreset();
}
}
};
问题是,在我选择其中一个预设后,选择会一直保留,直到应用程序从多任务处理中关闭(MainActivity 被重新启动或终止)。然后,如果我重新打开应用程序,对话框的选择将重新设置为 0 ("Disabled")。
为什么会这样?你有解决办法吗?
是的,每次为相应的对象重新创建该字段,并且由于该对象(即 activity)被销毁,保存该字段的内存也被释放。因此,字段的寿命受对象的寿命限制。为了使其连续,最好将值保存在 SharedPreferences
中,或者通常在销毁 activity 之前将其写出到某个存储空间,例如在 onPause()
中,然后在 onCreate()
或 onResume()
回调中从这些首选项中获取它。例如:
/*--- Saving ---*/
SharedPreferences prefs =
getApplicationContext().getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE);
prefs.edit().putInt(KEY_NAME, VALUE).apply();
/*--- Retrieving ---*/
int oldValue =
getApplicationContext().getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE)
.getInt(KEY_NAME, 0);
PREFERENCES_NAME
是您的共享首选项文件的文件名。 KEY_NAME
是键,您可以在其下保存并稍后检索存储的值。 VALUE
只是要保存的值。
希望对您有所帮助!
由于您没有保留用户的选择,因此选择会保留在内存中,直到 activity 完成。例如,您应该使用 SharedPreferences 或 sqlite 在本地保存用户的选择!
当 activity 重新启动时,您可以读取保存的值并将选项设置为选中!
大家好,祝大家新年快乐!
我的应用程序遇到了一个我似乎无法修复的奇怪问题。这应该是一个逻辑错误,但我无法以某种方式捕获它。
这是我的代码
public String[] str={"Disabled","Sound Quality Prefered","Bass Prefered","Battery Prefered",};
public int ThemePresetValue = 0;
private int SelectedThemePresetValue = 0;
public void presets() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setTitle("Select Your Sound Preset");
alertDialog.setNegativeButton("Cancel", null);
alertDialog.setPositiveButton("Select", themePresetDialogPositiveListener);
alertDialog.setSingleChoiceItems(str, ThemePresetValue, PresetListListener);
alertDialog.show();}
DialogInterface.OnClickListener PresetListListener =
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SelectedThemePresetValue = which;
}
};
DialogInterface.OnClickListener themePresetDialogPositiveListener =
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mPreset = "";
ThemePresetValue = SelectedThemePresetValue;
if (ThemePresetValue == 0) {
mPreset = "Disabled";
} else if (ThemePresetValue == 1) {
mPreset = "Sound Quality Prefered";
} else if (ThemePresetValue == 2) {
mPreset = "Bass Prefered";
} else if (ThemePresetValue == 3) {
mPreset = "Battery Prefered";
}
if (mPreset.equals("Disabled")) {
disabler();
} else if (mPreset.equals("Sound Quality Prefered")) {
SoundQPreset();
} else if (mPreset.equals("Bass Prefered")) {
bassPreset();
} else if (mPreset.equals("Battery Prefered")) {
batteryPreset();
}
}
};
问题是,在我选择其中一个预设后,选择会一直保留,直到应用程序从多任务处理中关闭(MainActivity 被重新启动或终止)。然后,如果我重新打开应用程序,对话框的选择将重新设置为 0 ("Disabled")。
为什么会这样?你有解决办法吗?
是的,每次为相应的对象重新创建该字段,并且由于该对象(即 activity)被销毁,保存该字段的内存也被释放。因此,字段的寿命受对象的寿命限制。为了使其连续,最好将值保存在 SharedPreferences
中,或者通常在销毁 activity 之前将其写出到某个存储空间,例如在 onPause()
中,然后在 onCreate()
或 onResume()
回调中从这些首选项中获取它。例如:
/*--- Saving ---*/
SharedPreferences prefs =
getApplicationContext().getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE);
prefs.edit().putInt(KEY_NAME, VALUE).apply();
/*--- Retrieving ---*/
int oldValue =
getApplicationContext().getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE)
.getInt(KEY_NAME, 0);
PREFERENCES_NAME
是您的共享首选项文件的文件名。 KEY_NAME
是键,您可以在其下保存并稍后检索存储的值。 VALUE
只是要保存的值。
希望对您有所帮助!
由于您没有保留用户的选择,因此选择会保留在内存中,直到 activity 完成。例如,您应该使用 SharedPreferences 或 sqlite 在本地保存用户的选择!
当 activity 重新启动时,您可以读取保存的值并将选项设置为选中!