Использовать SharedPreferences для отображения всплывающего окна только один раз

У меня есть следующий код в моем методе 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

Ответ 1

Попробуйте поставить код для хранения переменной 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();


        }

Ответ 2

Попробуйте вместо этого использовать apply(). Применить будет немедленно обновлять объект предпочтения и будет сохранять новые значения асинхронно, поэтому вы сможете прочитать последние значения.

Согласно документации:

В отличие от commit(), который синхронно записывает свои предпочтения в постоянное хранилище, apply() немедленно выполняет свои изменения в операциях SharedPreferences в памяти, но начинает асинхронную фиксацию на диск, и вы не будете уведомлены о каких-либо сбоях. Если другой редактор этой SharedPreferences выполняет регулярную фиксацию(), а apply() все еще неактивен, commit() будет блокироваться до тех пор, пока все асинхронные транзакции не будут завершены, а также сам commit.

Далее говорится:

Поскольку экземпляры SharedPreferences представляют собой синглтоны внутри процесса, безопасно заменять любой экземпляр commit() с помощью apply(), если вы уже игнорировали возвращаемое значение.

Ответ 3

Создайте класс и назовите его НастройкаManager следующим образом:

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());