В предыдущих занятиях мы с вами создали
экран авторизации и экран показа профиля.
Но откуда же возьмутся пользователи?
Для этого нам нужно создать экран регистрации.
Мы предварительно подготовили для вас весь UI и его инициализацию.
Нам осталось только добавить логику.
Но перед этим давайте посмотрим, что у нас уже есть.
Откроем проект, перейдём в RegistrationFragment,
увидим четыре поля: mLogin, mPassword, PasswordAgain и Registration.
Первые три — EditText и Registration — это кнопка.
Посмотрим, как он выглядит в XML, то есть в layout; email,
введите пароль, введите пароль ещё раз и зарегистрироваться.
Всё довольно просто.
Вернёмся в RegistrationFragment.
Здесь у нас идёт простая обычная инициализация view.
Также мы добавили немного логики для
проверки корректности данных, которые мы вводим.
Она стандартна и практически ничем не отличается от той,
что есть на экране авторизации.
Поэтому мы её добавили заранее.
Метод isInputValid проверяет
совокупность email и паролей — правильности ввода.
isEmailValid проверяет правильность ввода
email; isPasswordValid проверяет правильность ввода паролей.
Метод showMessage нужен для показа сообщений; пока что он у нас
не используется.
Вся логика должна происходить
при нажатии на кнопку Registration;
для этого у нас есть mOnRegistrationClickListener.
Всех пользователей, с которыми мы будем работать внутри приложения,
мы будем хранить в SharedPreferences.
Для этого создадим класс SharedPreferencesHelper.
Перейдём в Package New Java Class Shared PreferencesHelper.
Нажмём OK.
[ЗВУК] Сразу
создадим public static final String для
имени нашего SharedPreferences-файла.
SHARED
PREF_NAME.
Назовём точно так же, как и называется само поле.
Далее.
Создадим сам private SharedPreferences
mSharedPreferences.
И проинициализируем его в конструкторе,
но мы сделаем это не так, а внутрь конструктора
передадим контекст и получим его из контекста,
то есть mSharedPreferences равняется context.getSharedPreferences.
В качестве первого аргумента он требует у нас название самого файла.
В качестве второго он требует режим, в котором будет работать SharedPreferences.
Context.MODE_PRIVATE.
Далее.
Нам нужно описать саму логику сохранения пользователей в SharedPreferences.
Для этого нам нужно создать два метода — getUsers и addUser.
Начнём с метода getUsers.
Это public метод, который возвращает нам список юзеров.
[ЗВУК] Называться он будет getUsers.
Для того чтобы хранить нам список пользователей внутри
SharedPreferences, необходимо использовать формат данных JSON,
потому что сам SharedPreferences не позволяет сохранять ни Serializable,
ни Parcelable объекты, но позволяет сохранять строки,
поэтому мы наш список пользователей будем
форматировать в JSON и сохранять как строку.
Соответственно, чтобы получить список пользователей,
нам нужно из JSON превратить её в список пользователей.
List <User> users равняется.
Тут нам поможет библиотека JSON.
Gson, если быть точнее; private Gson
mGson = new Gson;
mGson.from Json.
Тут он у нас попросит строку,
из которой необходимо будет создать лист юзеров.
Это у нас будет mSharedPreferences.get String.
Ему нужно будет передать ключ.
Ключ у нас будет USERS_KEY,
который мы сейчас с вами создадим.
И дефолтное значение параметра.
Извиняюсь, не туда добавил.
Сначала добавляем USERS_KEY и дефолтное значение параметра.
fromJson в качестве второго входного аргумента запрашивает Type.
Давайте создадим его.
public static final
Type USERS_
TYPE Type
выбираем reflect.
И делаем
Type.
И делаем TypeToken.
В качестве генерикового параметра передаём ему
лист юзеров — new TypeToken.
В качестве генерикового параметра — List Users с пустой реализацией.
И делаем getType.
И передаём его в fromJson вторым параметром.
USERS_TYPE.
Отлично.
И можно теперь его будет возвращать; users.
Но у вас будет ошибка, если в SharedPreferences ничего не будет.
Мы сразу же позаботимся об этом.
users равно null.
Если равно,
то возвращаем просто пустой ArrayList: new ArrayList User.
Иначе мы вернём
наш список юзеров.
Метод getUsers готов.
Теперь добавим метод addUser.
public boolean.
boolean нам нужен для того, чтобы определить,
был добавлен пользователь до этого или нет.
addUser User
users user
user.
Для того чтобы добавить пользователя в SharedPreferences,
сначала нужно получить всех пользователей оттуда.
List <User> users
= getUsers.
Далее пробежимся полностью по всему циклу и проверим,
нет ли пользователя, которого мы уже хотим создать.
То есть не создан ли.
for User u :
users.
И добавим условие проверки.
if u.get Login.equalsIgnoreCase
users user.getLogin.
[ЗВУК] Если такой логин уже есть в SharedPreferences,
то мы его просто не добавляем, соответственно, возвращаем false.
В другом случае, если этого не произошло и false не вернулось,
мы в список уже полученных юзеров добавляем нашего пользователя
и сохраняем его в SharedPreferences.
mSharedPreferences.edit.
put String
по ключу USERS_KEY,
и вторым параметром передаём само значение,
то есть mGson.to Json
и передаём в него наш список
users; Ну
и также в качестве второго параметра мы можем передать USERS_TYPE,
чтобы он перевёл нам всё правильно.
После того как мы это сделали, обязательно нужно добавить метод apply либо commit.
Мы добавили в SharedPreferences наш список пользователей.
Далее return true.
Метод addUser готов; основная логика
сохранения пользователей в SharedPreferences готова.
Давайте добавим её внутрь RegistrationFragment.
Переходим в RegistrationFragment, в mOnRegistrationClickListener.
И в методе onClick если все данные были введены верно,
то добавляем mSharedPreferences,
которого у нас нет.
Нужно создать поле.
Он будет у нас SharedPreference'ом.
SharedPreferencesHelper; mSharedPreferencesHelper.
И также его нужно проинициализировать в методе onCreateView.
new SharedPreferencesHelper, в который мы передадим контекст.
getActivity или Context; разница не принципиальна.
В этом методе мы добавим нового пользователя,
так как все данные введены верно.
new User mLogin.getText.toString.
И вторым параметром передаём Password:
getText toString;
и boolean isAdded
равняется результату добавления пользователя.
То есть если пользователь добавился, то вернётся true,
если пользователь не добавился, то вернётся false.
Соответственно, if isAdded, то возвращаем успех.
showMessageR.
string.success login_register_success.
Эту строку мы добавили заранее.
else showMessage
R.string login_register_error.
То есть ошибка при регистрации.
Давайте посмотрим, как это работает.
Запускаем наш эмулятор, нажимаем на «Зарегистрироваться»,
вводим email,
вводим пароль.
Введём «123», введём пароль ещё раз: «123»,
нажмём «Зарегистрироваться»,
и нам не покажется никакого сообщения.
Почему?
Давайте посмотрим,
где баги, что происходит.
«Зарегистрироваться».
Посмотрим, как ведёт себя метод isInputValid.
[ЗВУК] isEmailValid — true,
isPasswordValid — false.
Почему?
Потому что перейдём в метод
isPasswordValid; passwordequals — true,
isEmpty — false, isEmpty — false.
Всё верно, мы допустили ошибку в логике сравнения паролей.
Добавим «не» перед ними; то есть если они не пустые, то они нам подходят.
Запустим ещё раз и посмотрим, как работает.
[ЗВУК]
«Зарегистрироваться»: email.
Вводим email, вводим пароль
«fgh», fgh, «Зарегистрироваться».
Успешно!
Нажмём «Зарегистрироваться» ещё раз.
«Логин уже занят».
Как вы видите, наша ошибка выводится правильно.
В этом занятии мы научились использовать SharedPreferences и научились писать
какую-то бизнес-логику для приложения; эта бизнес-логика может подойти,
когда вы не используете сервер, а пишете просто тестовые приложения.