使用 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 只显示一次弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章

使用SharedPreferences进行数据存储

Xamarin.Android SharedPreferences的使用方法

Android学习总结——SharedPreferences

如何将整数保存到 SharedPreferences [重复]

SharedPreferences的用法

SharedPreferences XML 文件会增加它的大小吗?