共享首选项Boolean始终返回false

时间:2015-11-28 22:24:23

标签: java android

我正在使用共享偏好。为什么这个方法总是返回false?(这段代码来自这个tutorial)何时或如何返回true?我想检查它是否真的进入另一个活动

 public boolean isLoggedIn(){
        return pref.getBoolean("login", false);
    }

当我创建用户时,我正在添加Boolean true

 public void createLoginSession(String name, String email){
        // Storing login value as TRUE
        Toast.makeText(_context, "Create", Toast.LENGTH_SHORT).show();
        System.out.println("login1");
        editor.putBoolean("login", true);

        // Storing name in pref
        editor.putString("name", name);

        // Storing email in pref
        editor.putString("email", email);

        // commit changes
        editor.commit();
    }

这个方法是检查返回islogin true或false在这种情况下它总是为false,如何修复它返回呢?

/**
     * Check login method wil check user login status
     * If false it will redirect user to login page
     * Else won't do anything\
     * */
    public void checkLogin(){
        // Check login status


        if(!this.isLoggedIn()){
            Toast.makeText(_context, " Login", Toast.LENGTH_SHORT).show();

            // user is not logged in redirect him to Login Activity
            Intent i = new Intent(_context, Register.class);
            // Closing all the Activities
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

            // Add new Flag to start new Activity
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            // Staring Login Activity
            _context.startActivity(i);
        }
else {
            Intent i = new Intent(_context, UserProfile.class);
            // Closing all the Activities
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

            // Add new Flag to start new Activity
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            // Staring Login Activity
            _context.startActivity(i);
        }
    }

会话管理员课程

public class SessionManager {
    // Shared Preferences
    SharedPreferences pref;

    // Editor for Shared preferences
    Editor editor;

    // Context
    Context _context;

    // Shared pref mode
    int PRIVATE_MODE = 0;

    // Sharedpref file name
    private static final String PREF_NAME = "AndroidHivePref";

    // All Shared Preferences Keys
    private static final String IS_LOGIN = "IsLoggedIn";

    // User name (make variable public to access from outside)
    public static final String KEY_NAME = "name";

    // Email address (make variable public to access from outside)
    public static final String KEY_EMAIL = "email";

    // Constructor
    public SessionManager(Context context){
        this._context = context;
        pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
        editor = pref.edit();
    }

    /**
     * Create login session
     * */
    public void createLoginSession(String name, String email){
        // Storing login value as TRUE
        Toast.makeText(_context, "Create", Toast.LENGTH_SHORT).show();
        System.out.println("login1");
        editor.putBoolean("login", true);

        // Storing name in pref
        editor.putString("name", name);

        // Storing email in pref
        editor.putString("email", email);

        // commit changes
        editor.commit();
    }

    /**
     * Check login method wil check user login status
     * If false it will redirect user to login page
     * Else won't do anything\
     * */
    public void checkLogin(){
        // Check login status
     //   editor.putBoolean("login", true);

        if(!this.isLoggedIn()){
            Toast.makeText(_context, " Login", Toast.LENGTH_SHORT).show();

            // user is not logged in redirect him to Login Activity
            Intent i = new Intent(_context, Register.class);
            // Closing all the Activities
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

            // Add new Flag to start new Activity
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            // Staring Login Activity
            _context.startActivity(i);
        }
else {
            Intent i = new Intent(_context, UserProfile.class);
            // Closing all the Activities
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

            // Add new Flag to start new Activity
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            // Staring Login Activity
            _context.startActivity(i);
        }
    }



    /**
     * Get stored session data
     * */
    public HashMap<String, String> getUserDetails(){
        HashMap<String, String> user = new HashMap<String, String>();
        // user name
        user.put(KEY_NAME, pref.getString(KEY_NAME, null));

        // user email id
        user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null));

        // return user
        return user;
    }

    /**
     * Clear session details
     * */
    public void logoutUser(){
        // Clearing all data from Shared Preferences
        editor.clear();
        editor.commit();

        // After logout redirect user to Loing Activity
        Intent i = new Intent(_context, MainActivity.class);
        // Closing all the Activities
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        // Add new Flag to start new Activity
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        // Staring Login Activity
        _context.startActivity(i);
    }

    /**
     * Quick check for login
     * **/
    // Get Login State
    public boolean isLoggedIn(){
        return pref.getBoolean("login", false);
    }
}

修改

当我从光标中删除editor并将其添加到此处时,它可以正常工作

public void checkLogin(){
    // Check login status
    pref = PreferenceManager.getDefaultSharedPreferences(_context);
    editor = pref.edit();

       editor.putBoolean("login", true);

    if(!this.isLoggedIn()){
        Toast.makeText(_context, " Login", Toast.LENGTH_SHORT).show();

        // user is not logged in redirect him to Login Activity
        Intent i = new Intent(_context, Register.class);
        // Closing all the Activities
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

}

但奇怪的是,如果我在这里加入,它不起作用

public void createLoginSession(String name, String email){
    // Storing login value as TRUE
    Toast.makeText(_context, "Create", Toast.LENGTH_SHORT).show();
    System.out.println("login1");
    pref = PreferenceManager.getDefaultSharedPreferences(_context);
    // pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
    editor = pref.edit();
    editor.putBoolean("login", true);
...

3 个答案:

答案 0 :(得分:3)

而不是

pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);

pref = PreferenceManager.getDefaultSharedPreferences(context);

这是调试器中的上下文(ctx)。

enter image description here

因此,以下是如何检查首选项文件以验证它是否匹配。我还在第三个屏幕截图中编写了不同的代码,以演示一个小差异如何改变偏好位置。

在第一个屏幕截图中,注意调试器显示我正在写入的首选项文件的位置。 enter image description here

接下来,查看我正在阅读的文件的位置以及我如何初始化我的pref变量。我保存的偏好是正确的,就像我在最后一个屏幕中保存它一样。 enter image description here

最后,我以不同方式初始化了我的pref。看到不同?我的布尔值现在为false(默认值),文件位置不同。 enter image description here

现在,也许您每次都在设置相同的偏好。检查确定。几年前我遇到了这个确切的问题,它让我疯狂,直到我意识到我有不同的偏好文件被使用。这就是我发现问题的方法。

最后,看看我尝试获取上下文的不同方式。看看调试器中的每个是如何不同的?这可能不是你的问题,但是当你发现奇怪的断开连接时,请仔细查看你如何挂钩所有内容。 enter image description here

我希望这会有所帮助......

答案 1 :(得分:1)

确保编辑器已连接到SharedPreferences。我没有看到异常的东西,但使用prefs.edit()... commit();

会更安全

答案 2 :(得分:0)

您没有提到如何检索该值。但是在提交值时,您是否正在写入要从中检索的相同首选项文件?

  SharedPreferences myPref = getSharedPreferences(PREFS_NAME, 0);
  SharedPreferences.Editor editor = myPrefFIle.edit();
  editor.putBoolean("login", true);
  editor.commit();  

否则,你知道这很简单。

编辑

您可以尝试此首选项助手文件。用这个替换你,试试吧。如果你仍然看到问题,那么它是其他东西但不是偏好。

public class SharedPreferencesHelper {

    public static final String PFO_SHARED_PREF_NAME = "prefs_file";

    public static final String PREF_PLUG_STATE = "plug_state";
    public static final String PREF_ICE_BUTTON_STATE = "ice_button_state";

    private final SharedPreferences mPreferences;
    private final Context mContext;
    private static SharedPreferencesHelper instance = null;


    private SharedPreferencesHelper(Context context) {
        mContext = context;
        mPreferences = context.getSharedPreferences(PFO_SHARED_PREF_NAME,
                Context.MODE_PRIVATE);
    }

    public static SharedPreferencesHelper getInstance(final Context context) {
        if (instance == null) {
            instance = new SharedPreferencesHelper(context.getApplicationContext());
        }

        return instance;
    }

    public boolean getPlugState() {
        return mPreferences.getBoolean(PREF_PLUG_STATE, false);
    }

    public void storePlugState(boolean state) {
        SharedPreferences.Editor editor = mPreferences.edit();
        editor.putBoolean(PREF_PLUG_STATE, state);
        editor.apply();
    }
}  

你这样称呼,例如:

boolean pullPlugState = mPref.getPlugState();  

这是一个单身人士,但你可以在它开始工作后改变它。否则这不是一个大对象,所以单身人士完全没问题。