【问题标题】:SharedPreferences Not Saving after creating separate class for itSharedPreferences 在为其创建单独的类后未保存
【发布时间】:2026-02-20 00:45:02
【问题描述】:

我正在开发一个应用程序,其中我将值保存在 SharedPrefernces 中。我创建了一个单独的类 SharedPreferenceforAlarm 用于设置 或获取存储在 SharedPreferences 中的值。要设置或获取存储的值,我从不同的活动调用类对象。

我面临的问题是值没有正确保存。

例如(见代码):

alarmisSet 的默认值:False

alarmName 的默认值:无警报

如果 iam 从任何活动调用 setAlarm(this, true),则 iam 得到的日志是 “SHAREDPREFERENCES,警报已设置:false;”

如果 iam 调用 setAlarmName(),情况相同,默认 alarmName 打印的不是 iam 给出的那个。

值得一提的是,我为应用的首次运行创建了一个 setupHelp 活动。当我安装应用程序并运行它时,setuphelp 活动正在运行。第二次,setuphelp 没有显示。这意味着 SharedPreferencesforAlarm 类的 setFirstRun()getFirstRun() em> 工作正常,但之后就不行了。

还值得一提的是,将 alarmisSet 的默认值设置为 false alarmNameNo Alarm,Logcat 显示正确显示输出。

PS:我在不同的电脑上检查过,但还是没有成功。

/*****************************Shared Preference Class**************************************//


public class SharedPreferencesforAlarm {

public static final String TAG = "SHAREDPREFERENCES" ;
public static final String MyPREFERENCES = "Alarm" ;
public static final String firstRun="Firstrun";
public static final String alarmisSet="alarmisSet";
public static final String alarmName="alarmName";



public SharedPreferencesforAlarm() {
    super();
}

public void  setFirstRun(Context context) {
    SharedPreferences mySettings;
    mySettings = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
    Editor editor=mySettings.edit();
    editor.putBoolean(firstRun, true);
    editor.commit();
}

public Boolean getFirstRun(Context context) {
    SharedPreferences mySettings;
    mySettings = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
    return(mySettings.getBoolean(firstRun, false));
}

public void setAlarm(Context context, Boolean value) {
    SharedPreferences mySettings;
    mySettings = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
    Editor editor=mySettings.edit();
    editor.putBoolean(alarmisSet, value);
    editor.commit();
    Log.d(TAG,"Alarm is Set:"+value);
}

public Boolean getAlarm(Context context, Boolean value) {
    SharedPreferences mySettings;
    mySettings = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
    return(mySettings.getBoolean(alarmisSet, value));

}


public void setAlarmName(Context context,String name) {
    SharedPreferences mySettings;
    mySettings = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
    editor = mySettings.edit();
    editor.putString(alarmName, name);
    editor.commit();
    Log.d(TAG, "Alarm Name:" + name);
}

public String getAlarmName() {
    SharedPreferences mySettings;
    mySettings = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
    return(mySettings.getString(alarmName, null));

}

}

    /***********CODE FOR CALLING THE SHARED PREFERENCE CLASS FROM ANY ACTVITY*****************************//
SharedPreferencesforAlarm sharedPreferences = new    SharedPreferencesforAlarm(); //creating the object
sharedPreferences.setAlarm(this, true);
sharedPreferences.setAlarmName(this, alarmName.getText().toString()); //alarmName is a TextView

【问题讨论】:

  • 我看不出这段代码有什么问题。请在活动中发布您的完整代码。
  • 我正在从许多活动中调用 SharedPreference 类。我通过在活动的 onCreate() 中调用构造函数来创建对象。创建对象后,通过该对象调用 setAlarm() 或 getAlarm() 函数。
  • 我已经更新了问题,它将给出更清晰的图片。

标签: android android-activity sharedpreferences


【解决方案1】:

首先,让你的类抽象,它的方法是静态的,像这样:

public abstract class SharedPreferencesforAlarm {

    public static final String TAG = "SHAREDPREFERENCES";
    public static final String MyPREFERENCES = "Alarm";
    public static final String alarmisSet = "alarmisSet";
    public static final String alarmName = "alarmName";

    public static void setAlarm(Context context, Boolean value) {
        SharedPreferences mySettings;
        mySettings = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
        Editor editor = mySettings.edit();
        editor.putBoolean(alarmisSet, value);
        editor.commit();
        Log.d(TAG, "Alarm is Set:" + value);
    }

    // repreat for other classes
}

然后,您可以像这样调用您的方法,而无需一直创建新的 SharedPrefs 对象:

SharedPreferencesforAlarm.setAlarm(this, true);
SharedPreferencesforAlarm.setAlarmName(this, alarmName.getText().toString());

我在我的项目中就是这样做的,这是我目前能看到的唯一区别。

【讨论】:

  • 但是你将如何实例化它。不会给空指针异常吗?
  • 我编辑了我的答案,有一个错字。对此感到抱歉。由于您的类是抽象的,因此您不必实例化它。
  • 但我认为它会出错。如果方法是静态的,我们可以在不创建对象的情况下调用类的方法。不是吗?
  • 该死,我忘了类的方法也必须是静态的。我的错...所以请让它们静态并尝试一下,我将编辑我的答案。
  • 我已经更新了问题,它将给出更清晰的图片。
【解决方案2】:
  You write your code like this you have problem with Editor class.



public void setAlarm(Context context, boolean value) {
    SharedPreferences mySettings;
    mySettings = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = mySettings.edit();
    editor.putBoolean(alarmisSet, value);
    editor.commit();
    Log.d(TAG,"Alarm is Set:"+value);
}       

【讨论】:

  • 我已经更新了问题,它将给出更清晰的图片。
  • 嗨,我可以看到你的代码,请试试这个。 public void setAlarm(Context context, boolean value) { SharedPreferences mySettings; mySettings = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE); SharedPreferences.Editor 编辑器 = mySettings.edit(); editor.putBoolean(alarmisSet, value); editor.commit(); Log.d(TAG,"警报已设置:"+值); }
【解决方案3】:

我遇到了问题:关于 sharedpreferences.getBoolean() 方法的错误假设。

我假设

getBoolean(parameter, true)

如果参数为真且第二个参数为真则返回真,如果参数值为假且第二个参数为真则返回假,但实际上它只返回参数值。

【讨论】:

    最近更新 更多