SharedPreferences无法保存值

6

我有这段代码:

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
        }
    }
}

当我重新启动我的应用程序时,我总是以"false"的身份注册。我已经尝试在onStop()上提交它,但得到了相同的结果。我在这里看到了其他与此问题相关的主题,但没有一个像我这样有同样的问题。

有什么想法吗?

3个回答

20

你不能这样做:

settings.edit().putBoolean("registered", true);
settings.edit().commit(); 
你需要获取编辑器对象,然后进行更改:
Editor editor = settings.edit();
editor.putBoolean(...);
editor.commit();

非常感谢。它是SharedPreferences.Editor。它起作用了。但是你能解释一下为什么吗?也许是因为当我只调用方法时,他可能会在不同的“对象”上调用? - João Menighin
1
是的,每次调用.edit()时都会重置编辑器对象,因此当您为.commit()调用它时,它会清除您放入其中的布尔值。 - cjk
你可以执行 settings.edit().putBoolean("registered", true).commit(); (据我所记) - Martin Marconcini
为什么不使用 apply() 而是使用 commit() - IgorGanapolsky
这在Galaxy S3上无法工作,但在其他手机上运行良好。 - Zohidjon Akbarov

2
SharedPreferences prefs = PreferenceManager  
                        .getDefaultSharedPreferences(LoginActivity.this);  
                Editor edit = prefs.edit();  
                edit.putBoolean("registered", true);
                edit.commit(); 

使用这个。

0
其他答案也是正确的。
你也可以使用这个 settings.edit().putBoolean("registered", true).commit();

这似乎不起作用。请参考cjk的答案,他很好地解释了为什么! - Mohamed Amine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接