使用SharedPreferences仅显示弹出一次

时间:2016-02-06 17:42:16

标签: java android object sharedpreferences storage

在使用intent添加联系人后,我的onActivityForResult方法中包含以下代码。

  if (mySharedPrefs.getBoolean("settingsPopup", false) == false) { //First time

            new AlertDialog.Builder(this)
                    .setTitle("Go to settings? ")
                    .setMessage("POPUP")
                    .setNegativeButton("No", null)
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {

                            Intent settingsIntent = new Intent(MainActivity.this, Settings.class);
                            startActivity(settingsIntent);

                        }
                    }).show();

            myEditor = mySharedPrefs.edit();
            myEditor.putBoolean("settingsPopup", true);
            myEditor.commit();

        }

我希望这个弹出窗口只显示一次,这就是为什么我设置共享首选项键值" settingsPopup"在我第一次显示对话框后变为true。但出于某种原因,对话框显示每次 onActivityForResult方法被调用。为什么每次都显示?

PS:我使用相同的共享首选项对象来存储其他值。

修改

我在onCreate中初始化我的共享首选项,如下所示:

mySharedPrefs = this.getSharedPreferences("sharedPrefsName", MainActivity.MODE_PRIVATE); //Making a shared preferences

3 个答案:

答案 0 :(得分:0)

尝试将代码放在boolean代码之前存储AlertDialog变量:

if (mySharedPrefs.getBoolean("settingsPopup", false) == false) { //First time
            myEditor = mySharedPrefs.edit();
            myEditor.putBoolean("settingsPopup", true);
            myEditor.commit();

            new AlertDialog.Builder(this)
                    .setTitle("Go to settings? ")
                    .setMessage("POPUP")
                    .setNegativeButton("No", null)
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {

                            Intent settingsIntent = new Intent(MainActivity.this, Settings.class);
                            startActivity(settingsIntent);

                        }
                    }).show();


        }

答案 1 :(得分:0)

请尝试使用apply()。 Apply将立即更新首选项对象并异步保存新值,因此允许您读取最新值。

根据文件:

  

与commit()同步地将其首选项写入持久存储,apply()会立即将其更改提交到内存中的SharedPreferences,但会启动异步提交到磁盘,并且不会通知您任何失败。如果此SharedPreferences上的另一个编辑器在apply()尚未完成时执行常规commit(),则commit()将阻塞,直到完成所有异步提交以及提交本身。

接着说:

  

由于SharedPreferences实例是进程中的单例,如果您已经忽略了返回值,则可以使用apply()替换commit()的任何实例。

答案 2 :(得分:0)

创建一个类并将其命名为 SettingManager ,如下所示:

public class SettingsManager {
    public static final String DEFAULT_PREFERENCES_NAME = "defaultPreferences";

    public static final String PREFERENCE_FIRST_RUN = "isFirstRun";

    public static SharedPreferences getDefaultPreferences(Context context) {
        return context.getSharedPreferences(DEFAULT_PREFERENCES_NAME, Context.MODE_PRIVATE);
    }

    public static boolean isFirstRun(Context context) {
        SharedPreferences preferences = getDefaultPreferences(context);
        boolean isFirstRun = preferences.getBoolean(PREFERENCE_FIRST_RUN, true);
        preferences.edit().putBoolean(PREFERENCE_FIRST_RUN, false).commit();

        return isFirstRun;
    }

}

然后用这样的话来称呼它:

boolean isFirstRun = SettingManager.isFirstRun(getActivity());