Экраны
Основными элементами декларативного программирования являются экраны, которые могут реализовываться в виде активити или фрагмента. Выбор типа конкретного экрана определяется программистом как обычно.
Экран можно описать четырьмя методами:
activity(String name, int layoutId) activity(String name, int layoutId, String title, String formatParams) activity(String name, int layoutId, Class<T> additionalWork) activity(String name, Class customActivity)
аналогично задается и фрагмент
fragment(String name, int layoutId) fragment(String name, int layoutId, String title, String formatParams) fragment(String name, int layoutId, Class<T> additionalWork) fragment(String name, Class customFragment)
Здесь name - имя экрана; layoutId - id лайоута с XML разметкой экрана; title - текст который будет выводиться в заголовке (тулбаре) экрана. В этом случае элемент разметки должен иметь id "title".
Если параметр title будет форматом, то названия параметров для него заносятся через запятую в строку formatParams. При выполнении будут использованы значения соответствующих параметров. Если title не форматированная строка, то formatParams не указывается. Например,
activity(PRODUCT_DESCRIPT,R.layout.activity_product_descript,"%1$s", "catalog_name")
В активити с именем “PRODUCT_DESCRIPT” титул будет содержать значение параметра “catalog_name”.
Если необходимо выполнять некоторые нестандартные действия то используется третий метод описания экрана. В нем задается класс additionalWork в котором будут выполняться нестандартные действия. Этот класс должен наследоваться от класса MoreWork
Класс MoreWork содержит много переопределяемых методов, которые вызываются компонентами. Например, такие как: afterBindViewHolder - вызывается после занесения информации в item в компоненте типа list; changeValue - при изменении данных и т.д. В большинство методов передается параметр viewId - id компонента, который вызывает метод. По его значению можно определить какой из компонентов вызвал метод и написать соответствующую обработку. Порядок кастомной обработки в библиотеке декларативного программирования DePro приведен ниже.
Пользовательские экраны
В системе можно использовать и “обычные” (кастомные) фрагменты и активити. В этом случае используется четвертый метод описания экрана. Здесь customActivity (customFragment) обычные активити и фрагменты. Для взаимодействия с системными экранами они должны наследоваться от системных BaseActivity и BaseFragment соответственно. Для таких активити нужно не забыть описать их в манифесте. Если не предполагается использование возможностей системы, то они могут не наследоваться от системных BaseActivity и BaseFragment. Более подробно использование кастомных экранов описано ниже в разделе "Дополнительный материал".
Для фрагментов и активити можно задать дополнительный функционал:
.animate(AS.RL)
Задает анимацию выхода экрана. Константа RL задает анимацию справа налево. Также существуют другие константы: LR, TB, BT. Их значения контекстно понятные.
.setValue(ItemSetValue ... item)
Устанавливает значения элементов в разметке для всего экрана. Отдельное значение списка item задается следующим образом:
item(int viewId, ItemSetValue.TYPE_SOURCE source, String name) item(int viewId, ItemSetValue.TYPE_SOURCE source) item(int viewId, ItemSetValue.TYPE_SOURCE source, int componId)
Параметр viewId указывает id элемента разметки типа TextView в который будут заноситься данные. Источник данных TYPE_SOURCE может принимать значения enum TYPE_SOURCE {PARAM, SIZE, LOCALE}. Если источник = PARAM, то в viewId заносится значение параметра с именем name. Если источник = LOCALE, то в viewId заносится значение локали. В этом случае параметр name не указывается. Если источник = SIZE, то указывается id компонента типа list который будет заносить в viewId количество элементов списка
Также для экранна можно задать навигатор, в котором описываются действия, выполняемые при клике на элементы представления.
.navigator(ViewHandler ... handlers)
Каждый обработчик списка handlers имеет два обязательных параметра: viewId - id элемента представления который к которому прикреплен обработчик и тип действий. Остальные параметры зависят от типа. В описании обработчик задается следующим образом:
handler(int viewId, ViewHandler.TYPE type[, остальные параметры])
Более подробная информация о навигаторе приведена в разделе "Навигация в DePro".
Передача данных между экранами
Библиотека декларативного программирования DePro имеет несколько способов передачи данных между экранами. Выбор конкретного способа определяется потребностями задач.
Самый простой способ это передача значений для параметров запросов. Он осуществляется автоматически за счет глобального списка параметров и механизма обновления их значений. Поэтому программисту, как правило, не нужно заботиться об обновлении значений параметров.
Второй метод использовать глобальные переменные. Этот метод удобен при необходимости вносить изменения в данные на нескольких экранах.
Третий метод передавать данные непосредственно с вызовом экрана за счет использования флага RECORD или RECORD_COMPONENT. Это обеспечивает передачу параметров в вызываемый экран. Доступ к этим данным осуществляется через модель с методом ARGUMENTS. Для передачи данных в вызывающий экран нужно указать обработчик с типом RESULT_RECORD. В этом случае будет сформирована запись и осуществлен выход с экрана с флагом RESULT_OK. Возвращаемые данные будут доступны для всех обработчиков секции after вызывающего экрана.
Пример передачи данных между экранами с помощью глобальных переменных можно посмотреть в материалах урока 3. Пример передачи данных с помощью записей можно посмотреть в материалах уроков 2 и 7.