2017-07-04 51 views
2

我有一个Android应用程序,我在其中使用登录的共享首选项。直到现在我有一个像用户登录的流程..当登录成功时,凭据存储。并且当用户再次打开应用程序,用户名密码出现在编辑文本中。我有一个登录按钮,并有setonclicklistner登录并跳转到内部活动。 我正在尝试像用户登录成功时的流程...应用程序重新启动凭据存储..它应该自动进行下一个活动(内部活动)。 我曾尝试到现在为止..登录页面共享首选项不按预期方式工作

在OnCreate中打开下一个活动的onclicklistner如果凭据是好的

buttonlogin.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       if(etemail.getText().toString().equals("") && etpass.getText().toString().equals("")) 
       { 
        Toast.makeText(getApplicationContext(),"Enter your username and Password",Toast.LENGTH_LONG).show(); 
       } 
       else 
       { 
        load_data(); 
       } 

      } 
     }); 

共享PREF准则

private void savePreferences() { 
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 
      Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = settings.edit(); 

    // Edit and commit 
    UnameValue = etemail.getText().toString(); 
    PasswordValue = etpass.getText().toString(); 
    editor.putString(PREF_UNAME, UnameValue); 
    editor.putString(PREF_PASSWORD, PasswordValue); 
    editor.commit(); 
} 

private void loadPreferences() 
{ 
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 
      Context.MODE_PRIVATE); 

    // Get value 
    UnameValue = settings.getString(PREF_UNAME, DefaultUnameValue); 
    PasswordValue = settings.getString(PREF_PASSWORD, DefaultPasswordValue); 

    etemail.setText(UnameValue); 
    etpass.setText(PasswordValue); 
} 

我应该怎么为了实现这个目的?如果用户名密码被自动存储,打开下一个活动而不是单击登录按钮? 谢谢

+0

为什么使用'SharedPreferences'不'AccountManager'? – Pelocho

+0

使用SharedPreferences在我的经理给出的ToDo中。:)没什么我可以做的 – Akshay

回答

2

您可以在SharedPreferences类使用contains(String key) 可以在loadPreferences()

如果登录完成仅用于允许访问下一个活动,则不需要模拟按钮点击,但如果点击根据提供的用户名/密码加载其他数据,则必须在Button类中使用performClick()

使你的代码可能是这样的:

private void loadPreferences() 
{ 
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 
      Context.MODE_PRIVATE); 

    if(settings.contains(PREF_UNAME) && settings.contains(PREF_PASSWORD)){ 
     //you can start the 2nd activity directly here 
     //Intent intent = new Intent (...) 
     //startActivity(intent); 
     //finish(); 

     //OR 

     //load data into edittexts and programatically click the login button 
     UnameValue = settings.getString(PREF_UNAME, DefaultUnameValue); 
     PasswordValue = settings.getString(PREF_PASSWORD, DefaultPasswordValue); 

     etemail.setText(UnameValue); 
     etpass.setText(PasswordValue); 

     //here it will click the button as if the user did it. 
     btnLogin.performClick(); 
    }//contains 
} 

边注:这不是好的做法(不安全)以密码储存在SharedPreferences专门纯文本,未加密

+0

声音很有用..登录按钮只打开下一个活动没有别的,如果凭据是好的 – Akshay

+0

@Akshay正确的,在我看来,也许即使用户名/ pwd被存储,你可能想在开始下一个活动之前检查它们是否正确,以避免任何未来的错误或如此,如果你改变了密码...所以我认为更好的方法是使用'performClick()' – Yazan

+1

此外,这只是一个测试应用程序,将由最多4-5人使用,所以没有有关存储凭据的问题...反正谢谢队友得到它的工作 – Akshay

0

先打开下一个活动,然后在onCreate方法检查用户是否登录。如果没有关闭第一个,并打开登录活动。

MainActivity.java

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
session = new SessionManager(getApplicationContext()); 
     CheckLogin(); 
... 
} 
private void CheckLogin(){ 
     if(session.checkLogin()){finish();} 
    } 

SessionManager.java

public boolean checkLogin(){ 
     // Check login status 
     if(!this.isUserLoggedIn()){ 

      // user is not logged in redirect him to Login Activity 
      Intent i = new Intent(_context, LoginActivity.class); 

      // Closing all the Activities from stack 
      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); 

      return true; 
     } 
     return false; 
    } 
0

存储后在sharedpreference editor.putBoolean("hasLoggedin", true);

所以用户名和密码,它应该像

UnameValue = etemail.getText().toString(); 
    PasswordValue = etpass.getText().toString(); 
    editor.putString(PREF_UNAME, UnameValue); 
    editor.putString(PREF_PASSWORD, PasswordValue); 
    editor.putBoolean("hasLoggedin", true); 
    editor.commit(); 

然后,检查在onCreate方法类似

boolean hasLoggedin = sp.getBoolean("hasLoggedin", false); 
      if (hasLoggedin) { 
       Intent intent = new Intent(LoginActivity.this, HomeActivity.class); 
       startActivity(intent); 
       finish(); 
}