Зачем нам это надо? На этапе создания layout файла мы можем не обращаться к java коду вообще. Но в обычном приложении все данные поступают в layout динамически из java кода. Поэтому давайте создадим метод displayUserInfo() и там просто присвоим нашим View какое-то временное содержимое.
Мы используем обычный метод setText(), чтобы установить какой-то текст в наши TextView. Этот код уже больше похож на реальный, потому что именно так мы и будем устанавливать данные в наши View, когда получим ответ от сервера.
Добавление POJO объекта User.
Простые объекты в java называют POJO. POJO (англ. Plain Old Java Object) — «старый добрый Java-объект», простой Java-объект, не унаследованный от какого-то специфического объекта и не реализующий никаких служебных интерфейсов сверх тех, которые нужны для бизнес-модели.
Объекты нужны для того, чтобы хранить информацию в удобном для нас виде. Т.е. когда у себя в коде мы представляем данные в виде объектов реального мира. Есть пользователь User, у которого есть имя (поле name) и т.д.
Единственное, что нам осталось сделать – это добавить объект, который будет представлять все данные, которыми обладает пользователь. В нашем случае нам нужны следующие поля:
Идентификатор пользователя id
Ссылка на фотографию imageUrl
Имя пользователя name
Ник пользователя nick
Описание пользователя description
Местоположение пользователя location
Количество тех, кого читает пользователь followingCount
Количество тех, кто читает пользователя followersCount
Давайте создадим новый файл User.java. Только давайте перед этим создадим новый пакет, где будем хранить все сущности нашего приложения. Для этого нажмите правой кнопкой по пакету (папке) colibri.dev.com.colibritweet и выберете New -> Package.
Назовём наш пакет pojo.
После этого нам надо создать новый класс. Для этого нажмите правой кнопкой по пакету pojo и выберете New -> JavaClass. Введите имя User.
Видим, что у нас создался класс и мы можем добавлять в него свой код.
Отлично, давайте добавим поля, которые мы перечислили.
По умолчанию в сущностях используем модификатор доступа private, для того, чтобы не нарушать инкапсуляция класса, чтобы у внешнего кода не было возможности напрямую изменять значения этих полей. Поэтому чтобы установить значения полям мы создадим конструктор.
Конструктор мы можем создавать либо вручную, либо использовать функции AndroidStudio, чтобы она сделала эту рутинную работу за нас. Для этого надо зажать клавиши Alt + Insert, выбрать из контекстного меню Constructor.
После этого надо выбрать поля, которые мы хотим получать в конструкторе. В нашем случае – это все поля, поэтому выбираем все.
После этого нажимаем OK и видим, что конструктор сгенерировался автоматически.
Мы можем работать с таким классом, но для POJO классов есть правило большого пальца: всегда переопределять методы equals() и hashcode(). Если кто-то не знает, зачем это надо, то прервитесь и изучите эту статью.
Эти методы мы тоже сгенерируем автоматически. Для этого снова зажимаем клавиши Alt + Insert, выбираем equals() and hashcode(). После этого перед вами появится окно такого вида:
Здесь мы можем выбрать какой-то кастомный template для генерации методов, но пока будем пользоваться Intellij Default.
Нажимаем Next. После этого видим форму, в которой надо выбрать поля, который будут включены в метод equals(). Выбираем все поля, нажимаем Next
После этого видим форму, в которой надо выбрать поля, который будут включены в метод hashcode(). Выбираем все поля, нажимаем Next.
После этого, видим форму, в которой надо отметить, какие поля у нас всегда будут not null. Это надо, чтобы во время выполнения методов equals() и hashcode()приложение не сломалось с null pointer exception. В нашем случае у пользователя обязательно должны быть поля id, name, nick. Т.к. поле id является примитивом (типом long), то оно не может быть null не при каких обстоятельствах. Поэтому мы выбираем поля name, nick.
После этого видим, что у нас сгенерировались эти два метода.
publicclassUser{// Отстальной код выше не изменился
@Override
publicbooleanequals(Object o){if(this== o)returntrue;if(o ==null|| getClass()!= o.getClass())returnfalse;
User user =(User) o;if(id != user.id)returnfalse;if(followingCount != user.followingCount)returnfalse;if(followersCount != user.followersCount)returnfalse;if(imageUrl !=null?!imageUrl.equals(user.imageUrl): user.imageUrl!=null)returnfalse;if(!name.equals(user.name))returnfalse;if(!nick.equals(user.nick))returnfalse;if(description !=null?!description.equals(user.description): user.description!=null){returnfalse;}return location !=null? location.equals(user.location): user.location==null;}
@Override
publicinthashCode(){int result =(int)(id ^(id >>>32));
result =31* result +(imageUrl !=null? imageUrl.hashCode():0);
result =31* result + name.hashCode();
result =31* result + nick.hashCode();
result =31* result +(description !=null? description.hashCode():0);
result =31* result +(location !=null? location.hashCode():0);
result =31* result + followingCount;
result =31* result + followersCount;return result;}}
Если вы не переопределите эти два методы, то объекты буду сравниваться по ссылке, иначе по тому алгоритму, который описан в этих методах.
Использование POJOUser в UserInfoActivity
Теперь давайте добавим объект User в нашу Activity. Это надо, потому что от сервера мы получим именно такой объект. Т.е. на самом деле процесс получения данных пользователя делится на два действия:
Получение данных(объекта User) от источника данных (сервер, база данных, или заглушка для тестов).
Отображение данных.
Давайте создадим метод getUser(), в котором пока будем возвращать тестовый объект. В будущем мы заменим этот метод на взаимодейстие с реальным сервером.
UserInfoActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
publicclassUserInfoActivityextends AppCompatActivity {// Остальной код выше не изменилсяprivate User getUser(){returnnewUser(1L,"http://i.imgur.com/DvpvklR.png","DevColibri","devcolibri","Sample description","USA",42,42);}}
Видим, что в этом методе мы просто возвращаем в этом объекте все те же самые значения, которые мы использовали до этого.
Также нам надо немного изменить метод отображения данных пользователя. Надо добавить объект User как входной параметр и отображать данные из его полей.
UserInfoActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
publicclassUserInfoActivityextends AppCompatActivity {// Остальной код выше не изменилсяprivatevoiddisplayUserInfo(User user){
Picasso.with(this).load(user.getImageUrl()).into(userImageView);
nameTextView.setText(user.getName());
nickTextView.setText(user.getNick());
descriptionTextView.setText(user.getDescription());
locationTextView.setText(user.getLocation());
String followingCount = String.valueOf(user.getFollowingCount());
followingCountTextView.setText(followingCount);
String followersCount = String.valueOf(user.getFollowersCount());
followersCountTextView.setText(followersCount);}// Остальной код ниже не изменился}
Здесь практически ничего не изменилось. Единственное, что поля followingCount и followersCount имеют тип int, а метод setText() принимает только String входным параметром. Поэтому нам нужно сделать явное привидение к типу String.
Добавим ещё один метод loadUserInfo(), который будет вызывать метод getUser() и передавать его результат в метод displayUserInfo(user).
Запустим приложение. Видим, что все поля объекта успешно отобразились.
Подведём итоги:
При реальной работе приложения данные всегда приходят из java кода. Поэтому необходимо объявлять наши View в java коде и заполнять их информацией из реальных объектов.
Для удобного хранения данных используют POJO объекты. Они повышают уровень абстракции и позволяют хранить данные в виде, приближенном к реальному миру.
Сайт использует cookie-файлы для того, чтобы вам было удобнее им пользоваться. Для
продолжения работы с сайтом, вам необходимо принять использование cookie-файлов.
Создание View объектов в java коде. Связывание их с xml объектами
Первое, что нам надо сделать сегодня – это создать все наши
View
-компоненты вjava
коде и связать их с элементами вlayout
файле. Выглядит это так:UserInfoActivity.java
Зачем нам это надо? На этапе создания
layout
файла мы можем не обращаться кjava
коду вообще. Но в обычном приложении все данные поступают вlayout
динамически изjava
кода. Поэтому давайте создадим методdisplayUserInfo()
и там просто присвоим нашимView
какое-то временное содержимое.UserInfoActivity.java
Мы используем обычный метод
setText()
, чтобы установить какой-то текст в нашиTextView
. Этот код уже больше похож на реальный, потому что именно так мы и будем устанавливать данные в нашиView
, когда получим ответ от сервера.Добавление POJO объекта User.
Простые объекты в
java
называютPOJO
. POJO (англ. Plain Old Java Object) — «старый добрый Java-объект», простой Java-объект, не унаследованный от какого-то специфического объекта и не реализующий никаких служебных интерфейсов сверх тех, которые нужны для бизнес-модели.Объекты нужны для того, чтобы хранить информацию в удобном для нас виде. Т.е. когда у себя в коде мы представляем данные в виде объектов реального мира. Есть пользователь
User
, у которого есть имя (полеname
) и т.д.Единственное, что нам осталось сделать – это добавить объект, который будет представлять все данные, которыми обладает пользователь. В нашем случае нам нужны следующие поля:
id
imageUrl
name
nick
description
location
followingCount
followersCount
Давайте создадим новый файл
User.java
. Только давайте перед этим создадим новый пакет, где будем хранить все сущности нашего приложения. Для этого нажмите правой кнопкой по пакету (папке)colibri.dev.com.colibritweet
и выберетеNew -> Package
.Назовём наш пакет
pojo
.После этого нам надо создать новый класс. Для этого нажмите правой кнопкой по пакету
pojo
и выберетеNew -> JavaClass
. Введите имяUser
.Видим, что у нас создался класс и мы можем добавлять в него свой код.
Отлично, давайте добавим поля, которые мы перечислили.
User.java
По умолчанию в сущностях используем модификатор доступа
private
, для того, чтобы не нарушать инкапсуляция класса, чтобы у внешнего кода не было возможности напрямую изменять значения этих полей. Поэтому чтобы установить значения полям мы создадим конструктор.Конструктор мы можем создавать либо вручную, либо использовать функции
AndroidStudio
, чтобы она сделала эту рутинную работу за нас. Для этого надо зажать клавишиAlt + Insert
, выбрать из контекстного менюConstructor
.После этого надо выбрать поля, которые мы хотим получать в конструкторе. В нашем случае – это все поля, поэтому выбираем все.
После этого нажимаем
OK
и видим, что конструктор сгенерировался автоматически.User.java
Также (т.к. поля у нас
private
) нам надо создатьgetter
методы для всех полей. Давайте тоже сделаем это автоматически.По ананлогии с генерацией констурктора:
Alt + Insert
,Getter
.OK
.Видим, что наш класс теперь выглядит так:
Мы можем работать с таким классом, но для
POJO
классов есть правило большого пальца: всегда переопределять методыequals() и hashcode()
. Если кто-то не знает, зачем это надо, то прервитесь и изучите эту статью.Эти методы мы тоже сгенерируем автоматически. Для этого снова зажимаем клавиши
Alt + Insert
, выбираемequals() and hashcode()
. После этого перед вами появится окно такого вида:Здесь мы можем выбрать какой-то кастомный
template
для генерации методов, но пока будем пользоватьсяIntellij Default
.Нажимаем
Next
. После этого видим форму, в которой надо выбрать поля, который будут включены в методequals()
. Выбираем все поля, нажимаемNext
После этого видим форму, в которой надо выбрать поля, который будут включены в метод
hashcode()
. Выбираем все поля, нажимаемNext
.После этого, видим форму, в которой надо отметить, какие поля у нас всегда будут
not null
. Это надо, чтобы во время выполнения методовequals()
иhashcode()
приложение не сломалось сnull pointer exception
. В нашем случае у пользователя обязательно должны быть поляid
,name
,nick
. Т.к. полеid
является примитивом (типомlong
), то оно не может бытьnull
не при каких обстоятельствах. Поэтому мы выбираем поляname
,nick
.После этого видим, что у нас сгенерировались эти два метода.
User.java
Если вы не переопределите эти два методы, то объекты буду сравниваться по ссылке, иначе по тому алгоритму, который описан в этих методах.
Использование POJO User в UserInfoActivity
Теперь давайте добавим объект
User
в нашуActivity
. Это надо, потому что от сервера мы получим именно такой объект. Т.е. на самом деле процесс получения данных пользователя делится на два действия:User
) от источника данных (сервер, база данных, или заглушка для тестов).Давайте создадим метод
getUser()
, в котором пока будем возвращать тестовый объект. В будущем мы заменим этот метод на взаимодейстие с реальным сервером.UserInfoActivity.java
Видим, что в этом методе мы просто возвращаем в этом объекте все те же самые значения, которые мы использовали до этого.
Также нам надо немного изменить метод отображения данных пользователя. Надо добавить объект
User
как входной параметр и отображать данные из его полей.UserInfoActivity.java
Здесь практически ничего не изменилось. Единственное, что поля
followingCount
иfollowersCount
имеют типint
, а методsetText()
принимает толькоString
входным параметром. Поэтому нам нужно сделать явное привидение к типуString
.Добавим ещё один метод
loadUserInfo()
, который будет вызывать методgetUser()
и передавать его результат в методdisplayUserInfo(user)
.Итоговый код нашей
UserInfoActivity
:UserInfoActivity.java
Запустим приложение. Видим, что все поля объекта успешно отобразились.
Подведём итоги:
java
кода. Поэтому необходимо объявлять нашиView
вjava
коде и заполнять их информацией из реальных объектов.POJO
объекты. Они повышают уровень абстракции и позволяют хранить данные в виде, приближенном к реальному миру.