Как контролировать хранение пользовательских данных с помощью SharedPreferences при входе и выходе? - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь создать приложение, которое использует имя пользователя и пароль для входа в систему, а затем оставаться в системе до тех пор, пока пользователь не вышел из системы, или, конечно, не удалил данные приложения, и насколько я знаю, SharedPreferences является лучшим для этого. Как мне правильно это реализовать?

Я пытался создать объект SharedPreferences, а затем объект «Редактор», чтобы при запуске приложения проверять, сохранены ли данные для имени пользователя и пароля, и если это так, то входить автоматически. Затем для выхода из системы, после нажатия кнопки «Выход», имя пользователя и пароль удаляются из SharedPreferences. Но я не уверен, наверное, я сделал это неправильно, поэтому приложение не работает.

Вот простой пример того, что я хочу сделать (предположим, что все XML-файлы и идентификаторы верны, потому что приложение работало нормально до добавления SharedPreferences):

LoginActivity.java:

public class LoginActivity extends AppCompatActivity {
    private Button button_login;
    private EditText editText_username;
    private EditText editText_password;
    private SharedPreferences pref;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        perf = getApplicationContext().getSharedPreferences("user_pref", 0);
        SharedPreferences.Editor editor = perf.edit();
        if(!(sharedPref.getString("username", null)).isEmpty() && !(sharedPref.getString("password", null)).isEmpty()){
            doLogin(sharedPref.getString("username", null), sharedPref.getString("password", null));
        }

        //define editText_username, editText_password and button_login
        button_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!TextUtils.isEmpty(editText_username.getText()) && !TextUtils.isEmpty(editText_password.getText())){
                    doLogin(editText_username.getText().toString().trim(), editText_password.getText().toString().trim());
                }
            }
        });
    }


    public void doLogin(String username, String password) {

        Intent loginIntent = new Intent(LoginActivity.this, HomeActivity.class);
        SharedPreferences.Editor editor = perf.edit();
        editor.putString("username", username);
        editor.putString("password", password);
        startActivity(loginIntent);
                        finish();
    }

}

HomeActivity.java:

public class HomeActivity extends AppCompatActivity {
    private SharedPreferences perf;
    private Button button_logout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        perf = getApplicationContext().getSharedPreferences("user_pref", 0);


        //button_logout define
        button_logout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences.Editor editor = perf.edit();
                editor.remove("username");
                editor.remove("password");
                Intent logoutIntent = new Intent(HomeActivity.this, LoginActivity.this);
                startActivity(logoutIntent);
                finish();
            }
        });
}

Я не получаю никаких результатов, он вылетает. Поэтому я не уверен, правильно ли я это сделал или нет.

Ответы [ 4 ]

0 голосов
/ 01 мая 2019

Упростите использование PowerPreference, чтобы вы могли сохранить пользователя как объект

Создать User класс

class User{
    String userName;
    String password;
}

Когда пользователь нажимает кнопку входа :

String userName = editText_username.getText().toString().trim();
String password = editText_username.getText().toString().trim();

doLogin(new User(userName,password);

Затем, используя PowerPreference, вы можете сохранить объект пользователя в общем предпочтении

public void doLogin(User user) {
   PowerPreference.getDefaultFile().putObject("key",user);
   Intent loginIntent = new Intent(LoginActivity.this, HomeActivity.class);           
   startActivity(loginIntent);
   finish();
}

В следующий раз, когда пользователь войдет в экран входа в систему onCreate () use

User user = PowerPreference.getDefaultFile().getObject("key",User.class)
if (user!=null){
  doLogin(user.userName,user.password)
}

Для возможности использования PowerPreference добавьте это к вам gradle

implementation 'com.aliassadi:power-preference-lib:1.4.1'
0 голосов
/ 22 апреля 2019

То, что вы сделали, является правильным, единственное, что вы не зафиксировали свои предпочтения.

Так ваша функция будет выглядеть так

public void doLogin(String username, String password) {

        Intent loginIntent = new Intent(LoginActivity.this, HomeActivity.class);
        SharedPreferences.Editor editor = perf.edit();
        editor.putString("username", username);
        editor.putString("password", password);
        editor.apply(); //This line will make necessary changes in SharedPreferences file
        startActivity(loginIntent);
        finish();
    }

добавить ту же строку на button_logout нажмите

Кроме того, я рекомендую вам создать служебный класс для операций SharedPreference.

0 голосов
/ 22 апреля 2019

Вы должны зафиксировать или применить изменения, сделанные в редакторе. Итак, после

        editor.putString("username", username);
        editor.putString("password", password);
        editor.apply(); // or editor.commit()
0 голосов
/ 22 апреля 2019

создать класс AppPreference: -

public class AppPrefrences {

    private static SharedPreferences mPrefs;
    private static SharedPreferences.Editor mPrefsEditor;

    public static boolean isUserLoggedOut(Context ctx) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        return mPrefs.getBoolean("id_logged_in", true);
    }

    public static void setUserLoggedOut(Context ctx, Boolean value) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        mPrefsEditor = mPrefs.edit();
        mPrefsEditor.putBoolean("id_logged_in", value);
        mPrefsEditor.commit();
    }

    public static String getUserName(Context ctx) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        return mPrefs.getString("name", "");
    }

    public static void setUserName(Context ctx, String value) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        mPrefsEditor = mPrefs.edit();
        mPrefsEditor.putString("name", value);
        mPrefsEditor.commit();
    }
}

и теперь установите детали в классе AppPreference: -

AppPreference.setUserLoggedOut(this, false);
AppPreference.setUserName(this, "pass username here");

и получите имя пользователя следующим образом: -

AppPreference.getUserName(this);

или проверьте, что пользователь зарегистрирован или не находится на заставке: -

if (isUserLoggedOut(StartActivity.this)) {
                    //user not logged in
                } else {
                   //User is logged in
                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...