【问题标题】:setSingleChoiceItems value doesn't stick after Activity killActivity 终止后 setSingleChoiceItems 值不保留
【发布时间】:2017-12-27 21:23:07
【问题描述】:

大家好,祝大家新年快乐!

我的应用出现了一个奇怪的问题,我似乎无法解决。这应该是一个逻辑错误,但我无法以某种方式抓住它。

这是我的代码

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(“已禁用”)。

为什么会这样?你有解决办法吗?

【问题讨论】:

    标签: java android persistence


    【解决方案1】:

    是的,每次都会为相应的对象重新创建该字段,并且由于该对象(即活动)被破坏,因此保存该字段的内存也被释放。因此,场的寿命受对象寿命的限制。为了使其连续,您最好将值保存在SharedPreferences 中,或者通常在销毁活动之前将其写入某个存储,例如在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 只是要保存的值。

    希望这会有所帮助!

    【讨论】:

    • 谢谢老兄!我以为我必须使用 sharedPreferences(我已经将它与开关一起使用)但我不知道正确的实现!
    • @androidexpert35 确保您是从 Activity 或 Context 的其他子类调用它。
    • 我在 MainActivity 中调用它,但在 onCreate() 之外,因为对话代码在 onCreate() 之外。这可能是问题吗?
    • 不,不应该。无论如何,请检查 this 会发生什么。
    【解决方案2】:

    由于您没有保留用户的选择,因此选择会保留在内存中,直到活动完成。例如,您应该使用 SharedPreferences 或 sqlite 在本地保存用户的选择!

    当活动重新启动时,您可以读取保存的值并将选项设置为选中!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 2019-03-13
      • 2012-09-12
      相关资源
      最近更新 更多