我正在为我的家庭作业项目制作简单的登录应用程序。我想让用户保持登录状态 在我的应用程序被销毁之后。我设法做到了,但是现在他始终可以登录,即使不输入电子邮件和密码。我希望能够保持登录状态,直到他按下注销按钮,但是即使他按下它,他也将返回登录状态在页面中,但是当应用重新启动时,它将再次登录
我尝试过:How to keep android applications always be logged in state?
登录页面
public class MainActivity extends AppCompatActivity {
private EditText email, password;
private SharedPreferences sharedPreferences;
public static final String PREF_NAME = "sp_name";
ConstraintLayout constraintLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
email = findViewById(R.id.email_view);
password = findViewById(R.id.pass_view);
constraintLayout = findViewById(R.id.activity_main);
sharedPreferences = getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
// //uzimam email vrednost iz sharedprefernce
String storedEmail = sharedPreferences.getString("EMAIL", null);
//uzimam password vrednosti
String storedPass = sharedPreferences.getString("PASSWORD", null);
if(storedEmail != null && storedPass != null){
// login automatically with username and password
goToPocetnaStranica();
}
Button loginButton = findViewById(R.id.login_button);
//kada je dugme za login stisnuto loguje se na pocetnu stanu i skladisti login informacije
//u sharedpreference tak da sledeci put moze da se autologuje bez ponovnog unosa login informacija
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//uzimam email i password
String getEmail = email.getText().toString();
String getPass = password.getText().toString();
//proveravam da li je neko polje prazno
if (TextUtils.isEmpty(getEmail) || TextUtils.isEmpty(getPass)) {
Toast.makeText(MainActivity.this, R.string.obavestenje_za_unos, Toast.LENGTH_SHORT).show();
} else {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("EMAIL", getEmail);
editor.putString("PASSWORD", getPass);
editor.apply();
email.setText("");
password.setText("");
goToPocetnaStranica();
}
}
});
}
private void goToPocetnaStranica(){
Toast.makeText(MainActivity.this, R.string.uspesno_logovanje, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this, PocetnaStranica.class);
startActivity(intent);
}
}
我的页面登录后
public class PocetnaStranica extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pocetna_stranica);
Button logoutButton = findViewById(R.id.logout_button);
logoutButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = settings.edit();
editor.remove("PASSWORD");
editor.clear();
editor.apply();
finish();
}
});
}
}
答案 0 :(得分:2)
@Sebastian指出,您需要在if语句中使用AND运算符,而不是OR运算符。那是因为它检查电子邮件是否存在或密码是否存在。您在发布时仅删除了密码,因此电子邮件仍然存在。该程序将其视为已登录。此外,不要单独删除密码和电子邮件,而只需使用:
sharedPreferences.clear() //Clears every single value
这也将有助于删除缓存文件并节省浪费的内存空间。
编辑: 该错误实际上是在您的第二段代码中。此代码获取共享的首选项:
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
这确实获得了默认的共享首选项,但是它没有获取存储电子邮件和密码的首选项,而是返回了一组完全不同的共享首选项。相反,您应该做的是:
SharedPreferences pref = getApplicationContext().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
这与您在MainActivity.java中所做的相同,这是错误的:它必须相同。这里String PREF_NAME = "sp_name";
。偏好名称/ id正是为了识别共享的偏好而存在。
如果您想了解更多有关共享首选项及其工作方式的信息,请参阅文档:https://developer.android.com/reference/android/content/SharedPreferences
答案 1 :(得分:0)
似乎在您的主要活动中,当使用OR(||)运算符时,它应该是AND(&&)。
别忘了还要从首选项中删除电子邮件。