Использовать 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());