public
class
BasePresenterImpl
<
V
extends
BaseView
>
implements
BasePresenter
{
private
V mView
;
public
BasePresenterImpl
(
V pView
)
{
58
mView
=
pView
;
}
protected
V
view
()
{
return
mView
;
}
public
void
onCreate
()
{}
public
void
onResume
()
{}
public
void
onStop
()
{}
public
void
onDestroy
()
{}
}
Код 7. Базовый презентер
В классе BasePresenterImpl(Код 7) находиться минимум кода, так как
наше приложение не является огромной системой и не требует обширного
функционала, и имеет заглушки для некоторых методов, содержит ссылку на
представление для доступа к его функционалу. Остальные презентеры
должны наследовать от базового класса, чтобы получить его функционал.
Презентеры также как представления создаются в фабрике, которая
создает их по классу представления:
public
class
PresenterFactory
{
private
PresenterFactory
()
{
}
@SuppressWarnings
(
"unchecked"
)
public
static
<
P
extends
BasePresenter
,
V
extends
BaseView
>
P create
(
V
pView
)
{
if
(
pView
instanceof
MainView
)
return
(
P
)
new
MainPresenterImpl
((
MainView
)
pView
);
if
(
pView
instanceof
NewsView
)
return
(
P
)
new
NewsPresenterImpl
((
NewsView
)
pView
);
if
(
pView
instanceof
DirectionView
)
return
(
P
)
new
DirectionPresenterImpl
((
DirectionView
)
pView
);
return
(
P
)
new
BasePresenterImpl
(
pView
);
}
}
Код 8. Фабрика презентеров
59
Фабрика для распознавания класса представления использует
внутренние механизмы языка Java – рефлексию. В информатике отражение
или рефлексия означает процесс, во время которого программа может
отслеживать и модифицировать собственную структуру и поведение во
время выполнения. Рефлексия позволяет исследовать информацию о полях,
методах и конструкторах классов. Можно также выполнять операции над
полями и методами, которые исследуются. Рефлексия в Java осуществляется
с помощью Java Reflection API.
Теперь пришло время рассмотреть функциональность главного
представления приложения, которым является класс MainActivity:
public
class
MainActivity
extends
BaseViewActivity
<
MainPresenter
>
{
@Override
public
void
onSetup
()
{
createNavigationMenu
();
onNavigationItemSelected
(
mNavigationView
.
getMenu
().
getItem
(
0
));
}
private
void
createNavigationMenu
()
{
mNavigationView
.
setNavigationItemSelectedListener
(
this
);
setDrawerToggle
();
}
private
void
setDrawerToggle
()
{
mDrawerToggle
=
new
ActionBarDrawerToggle
(
this
,
mDrawerLayout
,
R
.
string
.
drawer_open
,
R
.
string
.
drawer_close
);
mDrawerLayout
.
setDrawerListener
(
mDrawerToggle
);
mDrawerToggle
.
setDrawerIndicatorEnabled
(
true
);
mDrawerToggle
.
syncState
();
}
@Override
public
boolean
onNavigationItemSelected
(
MenuItem item
)
{
switch
(
item
.
getItemId
())
{
case
R
.
id
.
news
:
ViewFactory
.
create
(
ViewFactory
.
NEWS_VIEW
).
show
(
this
,
null
);
break
;
case
R
.
id
.
directions
:
ViewFactory
.
create
(
ViewFactory
.
DIRECTIONS_VIEW
).
show
(
this
,
null
);
break
;
60
case
R
.
id
.
contacts
:
ViewFactory
.
create
(
ViewFactory
.
CONTACTS_VIEW
).
show
(
this
,
null
);
break
;
case
R
.
id
.
about_us
:
ViewFactory
.
create
(
ViewFactory
.
ABOUT_US_VIEW
).
show
(
this
,
null
);
break
;
}
Код 9. MainActivity
Данный класс является отправной точкой приложения, отсюда можно
открыть все представления приложения. Сначала создается левое меню
приложения, далее устанавливается кнопка для открытия меню.
Пользователь может открыть меню двумя способами:
Нажать на кнопку меню
Свайпом вправо
Откроется меню и можно будет выбрать пункт меню, после чего в том же
окне откроется другой раздел.
Пришло время приступить к созданию разделов приложения, которые
базируются на новом для Android компоненте под названием Fragment.
Фрагмент
(класс
Fragment)
представляет
поведение
или
часть
пользовательского интерфейса в Activity. Разработчик может объединить
несколько фрагментов в одну Activity для построения многопанельного
пользовательского интерфейса и повторного использования фрагмента в
нескольких Activity. Фрагмент можно рассматривать как модульную часть
Activity. Такая часть имеет свой жизненный цикл и самостоятельно
обрабатывает события ввода. Кроме того, ее можно добавить или удалить
непосредственно во время выполнения Activity. Это нечто вроде вложенной
Activity, которую можно многократно использовать в различных Activity.
Фрагмент (fragment) обычно представляет повторно используемую
часть пользовательского интерфейса активности, но он также может
представлять повторно используемый блок программной логики.
Приложение использует фрагменты для создания частей графического
интерфейса и управления ими. Фрагменты можно объединять для создания
61
интерфейсов, эффективно использующих размер экрана планшета. Кроме
того, простой механизм замены фрагментов сделает интерфейс приложения
более динамичным. Базовым классом всех фрагментов является класс
Fragment
(пакет
android.app).
При
использовании
субклассов
AppCompatActivity с фрагментами необходимо использовать версию этого
класса из библиотеки Android Support Library (пакет android.support.v4.app).
Каждый фрагмент, как и активность, имеет свой жизненный цикл и
предоставляет методы, которые можно переопределять для обработки
событий жизненного цикла. В этом приложении будут переопределены
следующий метод:
onCreateView — этот метод вызывается после onCreate; он должен
построить и вернуть объект View с графическим интерфейсом фрагмента.
Как мы вскоре увидем, он получает объект LayoutInflater, который
используется для программного заполнения графического интерфейса
фрагмента по компонентам, заданным в заранеео пределенном макете в
формате XML.
Жизненный цикл фрагмента связывается с жизненным циклом его
родительской активности. Существуют шесть методов жизненного цикла
активности, у которых имеются соответствующие методы жизненного цикла
фрагмента — onCreate, onStart, onResume, onPause, onStop и onDestroy. Когда
система вызывает эти методы для активности, это приводит к вызову
соответствующих методов всех присоединенных фрагментов активности (а
возможно, и других методов жизненного цикла фрагментов). В данном
приложении используются методы жизненного цикла фрагмента onResume и
onPause. Метод onResume вызывается в тот момент, когда фрагмент
находится на экране и готов к взаимодействию с пользователем. Когда
активность, управляющая фрагментами, возобновляет работу, вызываются
методы onResume всех ее фрагментов. Когда активность, управляющая
фрагментами, приостанавливается, вызываются методы onPause всех ее
фрагментов.
62
Фрагменты могут добавлять свои команды в меню управляющей
активности. Как класс Activity, класс Fragment содержит метод жизненного
цикла
onCreateOptionsMenu
и
метод
обработки
события
onOptionsItemSelected.
Метод
onCreateOptionsMenu
вызывается
для
инициализации
стандартного меню активности — этот метод вместе с методом
onOptionsItemSelected автоматически генерируется шаблоном Android Studio
Blank Activity. Система передает объект Menu, в котором должны
отображаться команды. В нашем приложении меню должно отображаться
только при запуске приложения в портретной ориентации. Объект Resources
класса Activity (возвращаемый унаследованным методом getResources)
используется для получения объекта Configuration (возвращаемого методом
getConfiguration), представляющего текущую конфигурацию устройства.
Открытая
переменная
экземпляра
orientation
содержит
признак
Configuration.ORIENTATION_PORTRAIT
или
Configuration.
ORIENTATION_LANDSCAPE. Метод getMenuInflater, унаследованный от
Activity, возвращает объект MenuInflater, для которого вызывается метод
inflate с двумя аргументами — идентификатором ресурса меню,
используемого для заполнения меню, и объектом Menu, в который будут
помещены команды меню. Если метод onCreateOptionsMenu возвращает true,
это означает, что меню должно отображаться на экране.
Фрагмент всегда должен быть встроен в Activity, и на его жизненный
цикл напрямую влияет жизненный цикл Activity. Например, когда операция
приостановлена, в том же состоянии находятся и все фрагменты внутри нее, а
когда Activity уничтожается, уничтожаются и все фрагменты. Однако пока
Activity
выполняется (это соответствует состоянию возобновления
жизненного цикла), можно манипулировать каждым фрагментом независимо,
например, добавлять или удалять их. Когда разработчик выполняет такие
транзакции с фрагментами, он может также добавить их в стек переходов
назад, которым управляет операция. Каждый элемент стека переходов назад
63
в операции является записью выполненной транзакции с фрагментом. Стек
переходов назад позволяет пользователю обратить транзакцию с фрагментом
(выполнить навигацию в обратном направлении), нажимая кнопку “ Назад”.
Родительская активность использует для управления своими
фрагментами объект FragmentManager (пакет android.app), возвращаемый
методом getFragmentManager класса Activity. Если активности потребуется
взаимодействовать с фрагментом, который объявлен в макете активности и
обладает идентификатором id, то для получения ссылки на заданный
фрагмент активность может вызвать метод findFragmentById класса
FragmentManager.
FragmentManager
может
использовать
объекты
FragmentTransaction
для
динамического
добавления,
удаления
и
переключения между фрагментами.
Мы узнали, что такое фрагменты и теперь можно приступить к
реализации базового класса для остальных фрагментов. Все фрагменты
попадают в категорию представлений и поэтому реализуют интерфейс
BaseView или реализуют потомков данного интерфейса. Ниже представлен
код BaseViewFragment (Код 10) который будет базовым:
Достарыңызбен бөлісу: |