登录页面共享首选项未按预期工作

时间:2017-07-04 06:23:36

标签: java android

我有一个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();
                }

            }
        });

共享首选项代码

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

如果要实现这一点,我该怎么做?如果自动存储用户名密码打开下一个活动而不是单击登录按钮? 感谢

3 个答案:

答案 0 :(得分:2)

您可以在contains(String key)课程中使用SharedPreferences 可以在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中存储密码并不是很好的做法(不安全),特别是纯文本,而不是加密

答案 1 :(得分: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;
    }

答案 2 :(得分: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();
}