70
args
.
putSerializable
(
CONST
.
CONTENT
,
direction
);
ViewFactory
.
create
(
ViewFactory
.
BACK_CONTENT_VIEW
).
show
(
getActivity
(),
args
);
}
}
}
Код 16. Фрагмент раздела направлений
Раздел работает рекурсивно, это значит, что если тип подраздел, тогда
открывается этот же раздел с
другим содержимым, а если тип раздел с
контентом тогда откроется новое окно, в котором отображается информация.
Презентер направлений такой же, как и новостной:
public
class
DirectionPresenterImpl
extends
BasePresenterImpl
<
DirectionView
>
implements
DirectionPresenter
{
public
DirectionPresenterImpl
(
DirectionView pView
)
{
super
(
pView
);
}
@Override
public
void
getDirection
(
int
pParent
)
{
DataProvider
.
getInstance
()
.
getDirection
(
pParent
)
.
subscribe
(
directions
->
{
view
().
showDirections
(
directions
);
});
}
}
Код 17. Презентер направлений
Мы создали много различных классов для отображения, теперь пришло
время создать классы провайдеров контента, и первый из них будет
посредник между презентерами и интернет провайдером:
public
class
DataProvider
implements
RemoteProvider
{
private
static
DataProvider sDataProvider
;
private
final
Context mContext
;
private
RemoteProvider mRemoteProvider
;
private
DataProvider
(
Context pContext
)
{
mContext
=
pContext
;
mRemoteProvider
=
new
RemoteDataProviderImpl
();
71
}
public
static
void
onCreate
(
Context pContext
)
{
sDataProvider
=
new
DataProvider
(
pContext
);
}
public
static
DataProvider
getInstance
()
{
return
sDataProvider
;
}
@Override
public
Observable
<
List
<
News
>>
getNews
(
int
pPage
)
{
return
mRemoteProvider
.
getNews
(
pPage
);
}
}
Код 18. Провайдер данных
В
данном случае провайдер принимает роль посредника (фасада) для
интернет провайдера, которого мы рассмотрим далее:
public
class
RemoteDataProviderImpl
implements
RemoteProvider
{
private
final
IntellectService mService
;
public
RemoteDataProviderImpl
()
{
OkHttpClient client
=
new
OkHttpClient
.
Builder
()
.
addInterceptor
(
new
HttpLoggingInterceptor
().
setLevel
(
HttpLoggingInterceptor
.
Level
.
BASIC
))
.
build
();
mService
=
new
Retrofit
.
Builder
()
.
baseUrl
(
BuildConfig
.
SERVER
)
.
client
(
client
)
.
addConverterFactory
(
GsonConverterFactory
.
create
())
.
addCallAdapterFactory
(
RxJavaCallAdapterFactory
.
create
())
.
build
()
.
create
(
IntellectService
.
class
);
}
@Override
public
Observable
<
List
<
News
>>
getNews
(
int
pPage
)
{
return
mService
.
getNews
(
pPage
);
}
}
}
Код 19. Интернет провайдер
72
В интернет провайдере создается сервис для доступа к данным в интернете с
помощью библиотеки Retrofit c применением Gson и RxJava, также
производиться логирование операций, и применение нового Http клиента
OkHttp который поддерживает безопасную передачу данных в сети.
А теперь создадим графический интерфейс пользователя для
приложения. Макетный редактор (Layout Editor) позволяет создать
графический интерфейс пользователя путем перетаскивания в окно
приложения компонентов GUI, таких как Button, TextView, ImageView и др.
По умолчанию описание макета для шаблона Empty App хранится в XML-
файле с именем activity_main. xml в папке res/layout. Мы воспользуемся
макетным редактором и окном Component Tree для построения приложения.
Разметка XML в файле activity_main.xml будет отредактирована только для
того, чтобы изменить способ размещения компонентов TextView и
ImageView, используемых в приложении.
Так как экраны устройств Android обладают разными размерами,
разрешением и плотностью пикселов (DPI, Dot Per Inch), разработчик обычно
предоставляет изображения с
разными разрешениями, а операционная
система выбирает графику на основании плотности пикселов устройства. По
этой причине папка res вашего проекта содержит несколько вложенных
папок, имена которых начинаются с префикса drawable. Например,
изображения для устройств с
плотностью пикселов, близкой к плотности
экрана телефона Google Nexus 6 (560 dpi) для нашего AVD, будут храниться
в папке drawable-xxxhdpi.
Задание размеров в пикселах, независимых от плотности (dp или dip),
позволяет платформе Android автоматически масштабировать графический
интерфейс пользователя в зависимости от плотности пикселов экрана
физического устройства. Размер пиксела, независимого от плотности,
эквивалентен размеру физического пиксела на экране с разрешением 160 dpi
(точек на дюйм). На экране с
разрешением 240 dpi размер пиксела,
73
независимого от плотности, будет масштабироваться с коэффициентом
240/160 (то есть 1,5). Таким образом, компонент, размер которого составляет
100 пикселов, независимых от плотности, будет масштабирован до размера в
150 физических пикселов на таком экране. На экране с разрешением 120
точек на дюйм каждый независимый от плотности пиксел масштабируется с
коэффициентом 120/160 (то есть 0,75). Значит, 100 независимых от
плотностей пикселов превратятся на таком экране в 75 физических пикселов.
Пикселы, независимые от масштабирования, масштабируются так же, как и
пикселы, независимые от плотности, но их масштаб зависит также и от
предпочитаемого размера шрифта, выбираемого пользователем (в настройках
устройства).
Достарыңызбен бөлісу: