【问题标题】:SharedPreferences doesn't save valueSharedPreferences 不保存价值
【发布时间】:2012-11-08 11:53:45
【问题描述】:

我有这个代码:

public class Register extends Activity {

    private LinearLayout layout;
    private TextView debug;
    public static final String USER_CONFIG = "UserConfigs";

    @Override
    public void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.register);

        SharedPreferences settings = getSharedPreferences(USER_CONFIG, MODE_PRIVATE);
        boolean registered = settings.getBoolean("registered", false);

        layout = (LinearLayout) findViewById(R.id.layoutRegister);

        if (!registered) {
            debug = new TextView(this);
            debug.setText("You have to register");
            layout.addView (debug);

            //TO DO user registration

            settings.edit().putBoolean("registered", true);
            settings.edit().commit(); 
        } else {
            debug = new TextView(this);
            debug.setText("You have already registered");
            layout.addView (debug);
            //TO DO skip to next screen
        }
    }
}

但是当我重新启动我的应用程序时,我总是被注册为“假”。我也尝试在onStop() 上提交它并得到相同的结果。我在这里看到过与此问题相关的其他主题,但没有一个与我有相同的问题。

有什么想法吗?

【问题讨论】:

    标签: android sharedpreferences


    【解决方案1】:

    你不能这样做:

    settings.edit().putBoolean("registered", true);
    settings.edit().commit(); 
    

    您需要获取编辑器对象,然后进行更改:

    Editor editor = settings.edit();
    editor.putBoolean(...);
    editor.commit();
    

    【讨论】:

    • 非常感谢。它是 SharedPreferences.Editor。有效。但是你能解释一下为什么吗?也许是因为当我只是调用方法时,他可能会调用不同的“对象”?
    • 是的,每次你调用 .edit() 时它都会重置 Editor 对象,因此当你为 .commit() 调用它时,它会清除你放入其中的布尔值。
    • 不过,你可以使用settings.edit().putBoolean("registered", true).commit();(据我所知)
    • 为什么不使用apply() 而不是commit()
    • 这不适用于 Galaxy S3,但其他手机运行良好
    【解决方案2】:
    SharedPreferences prefs = PreferenceManager  
                            .getDefaultSharedPreferences(LoginActivity.this);  
                    Editor edit = prefs.edit();  
                    edit.putBoolean("registered", true);
                    edit.commit(); 
    

    使用这个

    【讨论】:

      【解决方案3】:

      其他答案也是正确的。

      你也可以用这个

      settings.edit().putBoolean("registered", true).commit();

      【讨论】:

      • 这似乎不起作用。看到 cjk 的答案,他很好地解释了为什么!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      相关资源
      最近更新 更多