我正在使用共享偏好。为什么这个方法总是返回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);
...
答案 0 :(得分:3)
而不是
pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
试
pref = PreferenceManager.getDefaultSharedPreferences(context);
这是调试器中的上下文(ctx)。
因此,以下是如何检查首选项文件以验证它是否匹配。我还在第三个屏幕截图中编写了不同的代码,以演示一个小差异如何改变偏好位置。
在第一个屏幕截图中,注意调试器显示我正在写入的首选项文件的位置。
接下来,查看我正在阅读的文件的位置以及我如何初始化我的pref变量。我保存的偏好是正确的,就像我在最后一个屏幕中保存它一样。
最后,我以不同方式初始化了我的pref。看到不同?我的布尔值现在为false(默认值),文件位置不同。
现在,也许您每次都在设置相同的偏好。检查确定。几年前我遇到了这个确切的问题,它让我疯狂,直到我意识到我有不同的偏好文件被使用。这就是我发现问题的方法。
最后,看看我尝试获取上下文的不同方式。看看调试器中的每个是如何不同的?这可能不是你的问题,但是当你发现奇怪的断开连接时,请仔细查看你如何挂钩所有内容。
我希望这会有所帮助......
答案 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();
这是一个单身人士,但你可以在它开始工作后改变它。否则这不是一个大对象,所以单身人士完全没问题。