使用 SharedPreferences 只显示一次弹出窗口
Posted
技术标签:
【中文标题】使用 SharedPreferences 只显示一次弹出窗口【英文标题】:Use SharedPreferences to display popup only once 【发布时间】:2016-05-16 14:48:33 【问题描述】:使用意图添加联系人后,我的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
【问题讨论】:
为什么是== false
?注意 getBoolean 会更好看
嗯,是的,它和你所做的一样,我只是指出了一个不必要的等号:)
是的。无论如何,是的,您能否在问题中添加更多代码,例如在哪里初始化 SharedPreferences。你想只显示一次弹出窗口还是只在用户按下是时不显示它?
这段代码是循环调用的吗?
代码看起来很正常。你能把app info
屏幕上的数据清空再试一次吗?可能首选项文件已损坏。或者只是尝试为您的首选项文件使用不同的名称。
【参考方案1】:
创建一个类并将其命名为 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());
【讨论】:
好的,谢谢,但我的方式有什么问题?非常感谢阿米尔! @RuchirBaronia 我认为您没有得到正确的 Preference 实例;注意方式偏好是如何工作的。调试也是了解发生了什么的最佳方式 但是为什么呢?我在 onCreate 中实例化它?使用实例化编辑问题。 所以我让它工作了,但我不知道我做错了什么。当我为弹出窗口使用不同的共享首选项对象时,它起作用了。以前,我使用的共享首选项对象与我在课堂上使用的相同。为什么我不能使用同一个共享偏好对象来存储多个键值对? 您可以根据需要使用相同的共享首选项。只需定义另一个 PREFERENCE_FIRST_RUN 并定义另一个 isFirstRun【参考方案2】:尝试将代码存储在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();
【讨论】:
好的,我做到了,但它仍然无法正常工作。还有什么问题 AlertDialog 不会阻止任何代码执行,它在单独的线程上运行 你能把你创建共享偏好对象的代码贴出来吗? 在 onCreate:mySharedPrefs = this.getSharedPreferences("sharedPrefsName", MainActivity.MODE_PRIVATE); //Making a shared preferences
所以我让它工作了,但我不知道我做错了什么。当我为弹出窗口使用不同的共享首选项对象时,它起作用了。以前,我使用的共享首选项对象与我在课堂上使用的相同。为什么我不能使用同一个共享偏好对象来存储多个键值对?【参考方案3】:
尝试改用apply()
。 Apply 将立即更新首选项对象并异步保存新值,以便您读取最新值。
根据文档:
与 commit() 将其首选项同步写入持久存储不同,apply() 立即将其更改提交到内存中的 SharedPreferences 但开始异步提交到磁盘,并且您不会收到任何失败的通知。如果此 SharedPreferences 上的另一个编辑器在 apply() 仍未完成时执行常规 commit(),则 commit() 将阻塞,直到所有异步提交以及提交本身都完成。
接着说:
由于 SharedPreferences 实例是进程中的单例,如果您已经忽略了返回值,则可以安全地将任何 commit() 实例替换为 apply()。
【讨论】:
嘿,我试过apply()
,但还是不行。我已经用更多代码编辑了我的问题,包括我初始化首选项的代码。
所以我让它工作了,但我不知道我做错了什么。当我为弹出窗口使用不同的共享首选项对象时,它起作用了。以前,我使用的共享首选项对象与我在课堂上使用的相同。为什么我不能使用同一个共享偏好对象来存储多个键值对?以上是关于使用 SharedPreferences 只显示一次弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.Android SharedPreferences的使用方法
Android学习总结——SharedPreferences