首选项管理器始终加载默认值

Posted

技术标签:

【中文标题】首选项管理器始终加载默认值【英文标题】:Preference Manager loads always default value 【发布时间】:2014-04-29 20:17:10 【问题描述】:

我使用首选项管理器来保存一些整数和布尔值。 我创建了一个 SettingsPreferences 类:

public class SettingsPreferences 

    private Context mContext;

    public SettingsPreferences(Context context) 
        this.mContext = context;
    

    public boolean isNull() 
        if (PreferenceManager.getDefaultSharedPreferences(mContext) == null) 
            return true;
         else 
            return false;
        
    

    public void setBoolean(String name, boolean value) 
        PreferenceManager.getDefaultSharedPreferences(mContext).edit()
                .putBoolean(name, value).apply();
    

    public void setInt(String name, int value) 
        PreferenceManager.getDefaultSharedPreferences(mContext).edit()
                .putInt(name, value).apply();
    

    public boolean getBoolean(String name, boolean defaultValue) 
        return PreferenceManager.getDefaultSharedPreferences(mContext)
                .getBoolean(name, defaultValue);
    

    public int getInt(String name, int defaultValue) 
        return PreferenceManager.getDefaultSharedPreferences(mContext).getInt(
                name, defaultValue);
    

在 Main 类的 onCreate 方法中,我添加了默认值:

mSettingsPreferences = new SettingsPreferences(getApplicationContext());
if(mSettingsPreferences.isNull() == true) 
    mSettingsPreferences.setBoolean("MAX", 1);
    mSettingsPreferences.setBoolean("PROGRESS", 1);

在片段类中,我需要加载该数据并将其显示在进度条中。 这是代码:

Thread t = new Thread() 
   public void run() 
     try 
       sleep(100);
       SettingsPreferences sett = new SettingsPreferences(mContext);
       mProgBar.setMax(sett.getInt("MAX", 2));
       mProgBar.setProgress(sett.getInt("PROGRESS", 1));

      catch (InterruptedException e) 
       // TODO Auto-generated catch block
       e.printStackTrace();
     
   
;
t.start();

上下文是定义的,我检查了他,进度条也是,但每次它加载我的默认值。 有什么问题?

【问题讨论】:

在你的setXXX方法中,编辑后必须commi (developer.android.com/reference/android/content/…) ***.com/a/10186553/2015318 除了上述评论之外,您在一个调用中使用 setBoolean ,但您在另一个调用中使用 getInt 来获取相同的键!不要初始化值,只需传入默认值!像这样的不一致是通往噩梦的道路 【参考方案1】:

使用这个:

要初始化首选项,请使用:

SharedPreferences preferences = PreferenceManager
        .getDefaultSharedPreferences(context);
String string = preferences.getString(key, defValue);

现在是 Storind 数据:

Editor editor = preferences.edit();
editor.putString(key,value);
editor.commit();

有关更多信息,请参阅tutorial。

希望你能理解。

【讨论】:

问题不在于 SettingsPreference 类方法,因为我在其他类中使用相同的方法,它返回我保存的值。【参考方案2】:

您必须调用 Editor 的 commit() 来应用更改

【讨论】:

【参考方案3】:

我想你的 isNull() 总是返回 false,因为:

PreferenceManager.getDefaultSharedPreferences(mContext)

不会返回null,至少我从未见过这种情况。这样你就永远不会初始化你的 MAX 和 PROGRESS 值,最后你会读取默认值。

您可以使用 SharedPreferences.contains 方法来检查 MAX 是否存在,如果不存在则初始化它。

【讨论】:

以上是关于首选项管理器始终加载默认值的主要内容,如果未能解决你的问题,请参考以下文章

ReactJs 上下文未更新,值始终为默认值

无法访问用户默认值

在 Xamarin.Android 中将 Json 对象项中的错误值保存和检索到 IShared 首选项(始终返回注销值)

使用带有表格排序器插件的选择标签并将其默认为给定值

加载时选择选项默认值不显示,选择其他选项时不显示

奏鸣曲默认过滤器值