Введение
Общее описание
Структура приложения
Уроки
Описание библиотеки
Приложения

Компоненты

Общая характеристика

Экраны и компоненты

В библиотеке декларативного программирования DePro практически каждый экран представляет собой комплексную систему с множеством разных элементов: списками, формами заявки, блоками листания страниц, меню, выдвигающимися панелями и пр. Для большинства этих элементов давно уже разработаны не только дизайнерские решения, но и унифицированные программные продукты, в т.ч. и компанией Google. Как правило, привязка этих программных продуктов к особенностям дизайна экранов требует написания нескольких десятков, а то и сотен, строк кода. Вследствие этого большую часть времени программисты занимаются рутинной работой – привязкой заимствованных или собственных готовых программных продуктов. В тоже время весь этот код определяется лишь несколькими параметрами. Библиотека DePro как раз и обесечивает формальное описание элементов экранов только соответствующими параметрами и выполнение на их основе всего необходимого функционала.

Все элементы экранов описываются унифицированными компонентами, которым передается тип элемента и три группы параметров: модель, представление и навигатор (презентер).

    .component(TYPE, model(...), view(...), navigator(...))

Для некоторых компонентов имеется упрощенная нотация, которая более точно описывает специфику элемента. Для них используются и специальные названия, например: componentMap, componentYoutube и пр.

Таким образом описание экранов представляет собой описание ее компонентов (элементов):

    activity(String name, int layoutId)
        .component(TYPE, model(...), view(...), navigator(...))
        . . .
        .component(TYPE, model(...), view(...), navigator(...)):
        

Здесь TYPE - тип компонента, который предопределяет логику его работы. Может принимать интуитивно понятные значения: RECYCLER, SPINNER, MENU, PAGER, ... Модель (model) не зависит от типа компонента, а задает параметры для получения данных от различных источников. Представление (view) задает парметры которые зависят от типа компонента. Навигатор (navigator) содержит список обработчиков действий. Также не зависит от типа компонента.

Ниже описываются параметры, которые задаются переопределенными методами model(), view(), navigator

Модель

Метод model() описывает откуда и какие данные (модель) будут поступать компоненту (предаваться от компонента).

В наиболее общем случае для работы с REST API он имеет вид:

model(int method, String url, String param, long duration)

Здесь method - метод получения (передачи) данных, url - адрес в интернет (если он не начинается с http то впереди добавляется базовый url), param - перечень параметров запроса (отделяются запятыми), duration - время в течение которого данные не читаются с сервера, а берутся из кэша. Если duration=-1, то данные с кэша (при наличии) сразу передаются для отображения компоненту и осуществляется обращение к серверу для получения новых данных. После их получения они передаются компоненту и обновляется кэш.

Некоторые параметры могут отсутствовать. Например, при отсутствии параметра “method” будет использоваться метод по умолчанию (GET), либо тот который будет установлен в MyAppParams. При отсутствии duration кэширование не осуществляется.

В зависимости от метода получения данных сущность и количество параметров будут отличаться от общего случая. Особенности объявления модели будут рассмотрены для каждого метода ниже.

В настоящий момент реализовано получение (передача) данных с такими методами:

    - Сервер (интернет), методами GET и POST.
    - С аргументов, которые передаются экрану фрагменту через setArguments(bundle) 
            (не реализовано) или активити через intent (реализовано).
    - С переменной типа FIELD, в которой могут быть любые данные.
    - Локальной базы данных методы GET_DB, POST_DB, INSERT_DB, DEL_DB.
    - Данные, которые получены для всего экрана, и используются отдельными компонентами метод PARENT.
    - Глобальные переменные общие для всех экранов метод GLOBAL. 
            Предварительно глобальная переменная должна быть создана хандлером SET_GLOBAL.
    - Список международных телефонных кодов метод COUNTRY_CODE. 
            В этом случае в URL в виде строки задается перечень “популярных” кодов 
            (страны которые будут в начале списка) разделенных запятой.
    - Массив строк в ресурсах метод STRINGARRAY.
    - Строка в формате json метод JSON.

Модель может получать и данные которые формируются программно:

model(DataFieldGet dataFieldGet)

Пример:

model(new GetData())

Класс GetData содержит код который формирует данные. Этот класс нужно применять для очень сложных методов обработки локальных данных.

Для получения небольшого объема несложных локальных данных можно использовать метод JSON, например, model(JSON, getString(R.string.jsonListLang))

Модели можно задать дополнительный функционал:

.sort(String sortParam), строка sortParam содержит список названий полей разделенных запятой по которым нужно упорядочить данные модели. Естественно этот функционал нужно подключать к данным типа массив. Для данных типа запись он игнорируется.

.errorShowView(int viewId) Если в параметрах приложения мы указываем общее место куда нужно выводить сообщение об ошибках, то с помощью этого дополнительного функционала указывается viewId куда будет выводиться сообщение об ошибке конкретного метода model

.filters(int maxSize, FilterParam... item) в результирующий массив модели включаются только записи которые удовлетворяют необходимым условиям, но не более чем maxSize.

Элементы перечня условий задаются следующим образом:

filter(String nameField, Operation oper, Object value) операции сравнения могут быть enum Operation {equally, more, less, maxSize}

.addField(String nameField, int type, int value) ко всем записям массива добавляется поле с именем nameField типа type и значением value

.isAuth() Данная модель (с методами GET и POST) будет работать только с авторизованным пользователем. Если пользователь не авторизован (нет токена), то будет выдано сообщение стандартным способом. Имеется второй вариант этого функционала:

.isAuth(String authScreen) В этом случае сообщение выдаваться не будет, а будет вызван экран с именем authScreen. В большинстве случаев это экран авторизации.

.updateDB

.row

.progress

.pagination

.typeParam

.addToBeginning

.takeField

.changeNameField

.internetProvider

В приложении описано более подробно все методы модели и их особенности применения.

Представление

Метод view() описывает представление, а именно, с какими элементами разметки взаимодействует компонент.

Существует несколько переопределенных методов view. При описании конкретных типов компонентов все варианты view будут описаны подробно.

Также там будет и описан дополнительный функционал представления.

Описывает реакцию на действия пользователя. Отдельные действия описываются переопределенным методом обработчика - handler(), которые передаются параметрами в метод navigator():

navigator(handler(...), handler(...), handler(...) ...)

Метод navigator() может также относиться и ко всему экрану. Например, для активности: activity(“splash”, R.layout.activity_splash).navigator(handler(...), handler(...), handler(...) ...)

В общем случае обработчик имеет вид:

handler(id-view, тип обработки, дополнительные параметры),

Здесь: id-view - id элемента разметки при тапе (клике) на который нужно выполнить действия; тип обработки - тип действия, которое необходимо выполнить (полный перечень типов приведен в приложении.

Для некоторых типов действий имеются “персональные” названия обработчика. Например: back(int viewId),

start(int viewId, String screen) - при клике на viewId вызывается экран screen. Если нужно событие при клике на всем item, например для RecyclerView, то viewId нужно задать равным 0 либо вообще пропустить.

show(int viewId, int showViewId, boolean onActivity) - при клике на viewId будет показана showViewId, для фрагментов можно указать onActivity = true если нужно показать showViewId в активити. Если showViewId указывает на элемент типа SheetBottom (см. ниже), то он будет появляться с анимацией, обычный лайоут будет показываться или закрываться по setVisibility

showHide(int viewId, int showViewId, int textShowId, int textHideId) - используется для случаев когда необходимо показывать сокращенное либо полное описание. При клике на viewId в TextView с showViewId заносится либо строка textShowId, либо строка textHideId.

Обработчики выполняются в порядке их описания в navigator Поэтому если действия зависят между собой, то их нужно описывать в правильном порядке.

Более подробно Navigator описан в разделе Навигация в DePro.

componentBarcode

Предназначен для сканирования баркода.

В разметке используется BarcodeScanner

Описание:

    .componentBarcode(barcode_scanner, result_scan, repeat)

Здесь barcode_scanner - id элемента библиотечного класса BarcodeScanner. result_scan - id элемента в который заносится сосканированный код. repeat - id элемента по клику на который будет выполнено повторное сканирование.

Пример использования приведен в уроке 6.

calendar

Предназначен для формирования дат. Даты выбираются из календаря компонента.

Тип - CALENDAR

Описание:

    .calendar(calend, nameParam)

Здесь calend - id элемента разметки класса Calendar. Визуально Calendar представляет собой календарь. Пользователь может выбирать нужные даты. При каждом клике на датe ее значение (в миисекундах) заносится в глобальные параметры с названием заданным в nameParam. После этого посылается сообщение всем компонентам, которые на него подписались (в параметре eventComponent указали id элемента calend).

Пример использования приведен в уроке 8.

drawer

Предназначен для описания выдвижной панели навигации. Реализует функционал DrawerLayout

Тип - DRAWER.

Описание:

    .drawer(int viewId, int containerId, int drawerId, String screensContainer, String screensDrawer)

Может использоваться только с activity.

Параметры: viewId - id элемента разметки DrawerLayout, containerId - id контейнера для фрагментов, drawerId - id контейнера для фрагмента навигации (выдвигается слева), screensContainer - название фрагмента который сразу будет загружен в containerId (если он равен null, то ничего не загружается), screensDrawer - название фрагмента который будет загружен в drawerId.

Пример использования приведен в уроке 6.

enabled

Для элементов разметки управляет свойством enabled. Добавляется к описанию экрана.

Описание:

    .enabled(int viewId, int ... validId)

Здесь viewId - id элемента у которого устанавливается свойство enabled. Может быть любого типа. validId - id элементов, которые должны быть валидно заполненными. Можно использовать EditTextMask и ComponEditText. Эти классы имеют полезные свойства проверки на валидность вводимых данных и описаны ниже. Можно использовать и кастомные элементы. При их разработке нужно применять интерфейс IComponent.

Если все из перечисленных элементов валидны, то свойство enabled элемента viewId устанавливается в true, иначе в false. Проверка осуществляется при каждом изменении значений элементов.

Пример использования приведен в уроке 7.

fragmentsContainer Контейнер для фрагментов

В экранах типа активити можно задать контейнер для фрагментов.

    .fragmentsContainer(int fragmentsContainerId, String screen)

Здесь fragmentsContainerId id элемента разметки активити типа FrameLayout. В него будут загружаться фрагменты. Параметр screen указывает название стартового фрагмента. Если такого фрагмента нет, то параметр screen не указывается.

Пример использования приведен в уроке 5.

componentDateDiapason

Предназначен для формирования диапазона дат. Даты выбираются из календаря компонента.

Тип - DATE_DIAPASON

Описание:

    .componentDateDiapason(diapason)

Здесь diapason - id элемента разметки класса DateDiapason. Визуально DateDiapason представляет собой календарь. В исходном состоянии он, как правило, не виден (атрибут visibility="gone"). В атрибутах DateDiapason указываются, в частности, элементы (класса TextView) экрана, которые соответствуют дате "с" (from) и дате "по" (before). Работает компонент следующим образом. При клике на поле from DateDiapason становится видимым. Пользователь может выбирать нужные даты. При клике на кнопку оК выбранные даты диапазона заносятся в глобальные параметры с названиями соответствующими id полей from и before. Элемент становится невидимым. После этого посылается сообщение всем компонентам, которые на него подписались (в параметре eventComponent указали id элемента DateDiapason).

Пример использования приведен в уроке 7.

componentIntro

Предназначен для показа группы взаимосвязанных страниц с общей информацией о приложении. Часто их называют intro, tutorial, manual.

Тип - INTRO

Описание:

    .componentIntro(ParamModel model, int pager, int layoutId, int indicator, int skip, int next, int start)

Если на экране есть componentIntro, то никаких других компонентов не должно быть.

model - стандартная. Удобно в качестве источника данных использовать json строку.

Представление в этом компоненте не выделено в отдельный метод, а все необходимые элементы разметки перечисляются после модели. Работа компонента основана на функционале ViewPager.

Здесь pager - id ViewPager; layoutId - лайоут View, которая будет отображаться в ViewPager.

Далее идут id индикатора (indicator), который описан в разделе "Дополнительные элементы"; кнопок пропустить, продолжить, начать. Если какогото элемента нет в разметки указывается 0.

navigator - не предусмотрен

Пример использования приведен в уроке 5.

componentMap

Работа с картами

В разметке используется MapView

Описание:

    .componentMap(int viewId, [ParamModel paramModel, ] ParamMap paramMap[, Navigator navigator] [, int eventComponent])

Могут отсутствовать paramModel, navigator, eventComponent.

Здесь viewId - указывает id MapView в разметке.

В paramModel указывается методом model(...) модель данных для отображения маркеров, если они есть. В записях данных об маркерах координаты должны задаваться в полях с именами: "latitude" "longitude". Если могут быть различные типы маркеров, то номер их вида (иконка) задается в поле с именем "markerNumber" (имя этого поля можно задать в параметре paramMap). Все остальные поля разработчик устанавливает сам.

Параметры карты задаются в paramMap следующим образом:

    new ParamMap(boolean locationService)
        [.levelZoom(float levelZoom)]
        [.coordinateValue(double latBegin, double lonBegin, String title, float color)]
        [.markerImg(int myMarker, int otherMarker) | .markerImg(int myMarker, String nameField, int... args)]
        [.markerClick(int clickInfoWindowId, boolean onActivity)]

Если locationService = true будут использоваться определение местоположения.

К определенному таким образом paramMap устанавливается дополнительный yt j,zpfntkmysq функционал/

- levelZoom - задает начальный масштаб карты. При его отсутствии масштаб равен 16

- coordinateValue - задаются начальные координаты центра карты. Если будет отображаться маркер для местоположения устройства, то title задает титул для него, а color цвет. В свою очередь параметры title и color могут отсутствовать. Если в данных будут приходить маркеры различных типов, то информация о них задается следующим образом. Параметр nameField указывает название поля в котором находится номер маркера, а в args указывается перечень id соответствующих номеру иконок.

- markerClick описывает элемент разметки, который будет показываться при клике на маркер. В clickInfoWindowId указывается id этого элемента (InfoWindow) Связывание данных от модели и элементов clickInfoWindowId происходит по названиям. Если карта показывается во фрагменте и onActivity = false, то элемент будет вызван во фрагменте, если onActivity = true, то элемент будет вызван в активити (естественно она там должна быть описана).

Если был указан дополнительный функционал markerClick, то можно указать navigator в котором описываются действия по элементам InfoWindow.

eventComponent задает id того компонента при изменениях в котором будет меняться вид карты. Если такого компонента нет то задается 0.

В манифесте необходимо установить в элементах meta-data информацию о ключах API, com.google.android.gms.version:

<meta-data
   android:name="com.google.android.geo.API_KEY"
   android:value="@string/google_maps_key"/>

а также задать uses-permission ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION

Пример использования приведен в уроке 3.

Основное использование в фрагменте для бокового (выдвигающегося, drawer) меню. Основан на RecyclerView.

Тип - MENU.

Описание:

    .menu(ParamModel paramModel, ParamView paramView)

paramView может быть 2- типов:

view(int viewId), где viewId - id элемента разметки для меню

и

view(int viewId, int[] layoutTypeId), здесь layoutTypeId - список лайоутов с разметкой для различных состояний пунктов меню (нормальное, выделенное, разделитель, недоступное)

В первом случае вид меню установлен по умолчанию. Второй - если нужно устанавливать пользовательский вид.

paramModel может задаваться различными способами. В частности с помощью класса Menu :

Menu menu = new Menu()

либо:

Menu menu = Menu(int colorNorm, int colorSelect, int colorEnabl)

Второй конструктор используется если в описание меню не задаются пользовательские лайоуты пунктов меню. В этом случае colorNorm указывает id цвета (иконки и текста) нормального пункта меню, colorSelect - выделенного, colorEnabl не активного.

Пункты меню к нему добавляюся переопределенными методами:

.item(int icon, int title, String nameFragment)
.item(int icon, int title, String nameFragment, boolean start)

Здесь icon - id иконки которая будет показана в пункте меню, title - id строкового ресурса текст которого будет показан, nameFragment - имя фрагмента (активити) который будет запущен при клике на пункт, start - если = true, то этот элемент выбран.

К пункту меню (item) можно добавить указание на наличие бэйджика (значка):

.badge(String value)

значение будет показано в элементе разметки бейджик

.enabled(int enable)

здесь enable указатель какие условия влияют на активность пункта меню. В настоящее время реализовано только одно условие 1 - наличие токена. Если токен есть (прошла авторизация), то пункт у которого задано свойство enabled активный, иначе - не активный. При смене токена (выход\вход в приложение) активность пунктов будет изменяться.

Также к пункту меню можно добавить произвольные данные:

.addField(String name, int type, Object value)

Здесь name - имя поля, type - тип поля (типы берутся из класса Field), value - значение поля. ДЛЯ СТРОК ПРЕДУСМОТРЕТЬ ПЕРЕДАВАТЬ id

Разделитель пунктов задается так:

.divider()

Пример использования приведен в уроке 6.

menuBottom

Меню в виде кнопок (RadioGroop)

Описание:

    .menuBottom(int viewId, String ... args)

Здесь: viewId - id RadioGroop; args - список названий фрагментов, которые будут загружаться при клике на соответствующую кнопку. Для указания выбранного элемента меню, как обычно нужно для соответствующего RadioButton свойство checked установить в true.

Обязательно наличие в этой же активити компонента fragmentsContainer

Пример использования приведен в уроке 1.

componentModel

Вводит данные общего пользования для экрана.

Описание:

    .componentModel([name_data, ]model)

Здесь name_data - имя данных под которыми они сохраняются в экране (если отсутствует, то имя равняется "PARENT_MODEL"), model - модель данных, которые вводятся.

Доступ в компонентах к таким данным осуществляется по модели с типом PARENT.

компонент типа PAGER

Позволяет просматривать данные с возможностью перелистывания влево-вправо. Реализует функционал ViewPager.

Описание:

    .component(TC.PAGER_V, model(. . .), view(pager, item), navigator(. . .))
или
    .component(TC.PAGER_F, view(pager, fragment_1, . . . fragment_n))

Описание типа PAGER_V использует PagerAdapter т.е. показываются и перелистываются элементы типа View. Описание типа PAGER_F использует FragmentPagerAdapter т.е. показываются и перелистываются элементы типа Fragment.

Для компонента типа PAGER_V модель и navigator стандартные. В представлении (view задается pager - id элемента разметки ViewPager, item - id лайоута, который будет показывать ViewPager

Для компонента типа PAGER_F модель и navigator не предусмотрены. В представлении (view задается pager - id элемента разметки ViewPager, fragment_1, . . . fragment_n - список названий фрагментов, которые будут показывать ViewPager

Для компонентов обоих типов для представления можно указывать дополнительный функционал:

    .setTab(tabs, tab_name)

Задает параметры вкладок. Здесь tabs - id элемента разметки TabLayout, tab_name - id ресурса массив строк, для указания названий вкладок.

    .setIndicator(indicator)

Задает id элемента разметки PagerIndicator, который служит для индикации позиции текущей вкладки.

    .setFurtherView(further)

Здесь further - id элемента разметки, который служит для индикации позиции текущей вкладки.

    .visibilityManager(. . .)
    .setFurtherView(R.id.further)

компонент типа PANEL

Используется когда нужно присвоить значения группе элементов разметки. Эти элементы должны быть включены в LinearLayout или RelativeLayout. Описание:

    .component(TC.PANEL, ParamModel paramModel,ParamView paramView, Navigator navigator)

Здесь paramModel - задает параметры модели методом model(...), paramView задает методом view(int viewId) id лайоута в котором находятся элементы.

Для представления можно указать дополнительный функционал:

    .visibilityManager(Visibility ... args)

Управляет видимостью элементов разметки в зависимости от значений данных. Элементы списка args задают видимость отдельных элементов разметки:

    .visibility(int viewId, String nameField)

Параметр nameField содержит список полей, разделенных запятой. Если все указанные поля не пустые, то элемент viewId отображается.

Пример использования приведен в уроке 3.

компонент типа PANEL_ENTER

Используется когда нужно ввести данные. Данные вводятся в элементы формы (панели). Описание:

    .component(TC.PANEL_ENTER, ParamModel paramModel,ParamView paramView, Navigator navigator)

Значения параметров аналогично как у компонента PANEL.

Как правило в навигаторе в этом компоненте используются обработчики связанные с передачей данных. Например, CLICK_SEND или TYPE_PARAM_FOR_SCREEN.

Для компонента можно указать дополнительный функционал:

    .enabled(int viewId, int ... validId) - управляет свойством enabled элемента viewId. 

В списке validId указываются id элементов значения которых влияют на видимость viewId. Если все элементы списка validId валидны, то enabled устанавливается в true.

Для обеспечения возможности проверки элементов на валидность средствами библиотеки нужно использовать ComponEditText (описан ниже)

Пример использования приведен в уроке 3.

componentPhoto

Вводит изображение с различных источников (камера, галерея, ...)

Пример:

componentPhoto(int viewClick, int[] imageView, int idTextPermits)

Здесь viewClick - id элемента по клику на который начинается выбор источника изображения, imageView - массив id ImageView куда заносится изображение, idTextPermits - id строки текст которой будет показан в меню выбора источника.

В манифесте нужно указать

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>

и провайдер:
<provider
   android:name=".MyFileProvider"
   android:authorities="${applicationId}.provider"
   android:exported="false"
   android:grantUriPermissions="true">
   <meta-data
       android:name="android.support.FILE_PROVIDER_PATHS"
       android:resource="@xml/file_paths"/>
</provider>

Для которого необходимо создать файл MyFileProvider, создать в ресурсах папку xml и в ней файл file_paths:


<paths xmlns:android="http://schemas.android.com/apk/res/android">
   <external-path name="external_files" path="." />
</paths>

Пример использования приведен в уроке 5.

plusMinus

Данный компонент используется если нужно увеличивать\уменьшать на единицу значение элемена разметки PlusMinus путем клика на кнопки плюс или минус.

.plusMinus(int editId, int plusId, int minusId, Navigator navigator, Multiply... args)

Здесь editId - id элемента разметки типа PlusMinus. Параметры plusId и minusId задают id элементов которые будут при отображении на экране ассоциировать с соответствующими операциями, например иконки со знаками + и -. Параметр navigator - стандартный и в большинстве случаев не используется (= null).

Этому компоненту в разметке нужно указать элемент типа PlusMinus (наследник AppCompatEditText), который описан в разделе “Дополнительные элементы”.

Элементу разметки PlusMinus можно задать атрибуты:

noEdit = "true" если поле будет отображаться как TextView без возможности ввода.
minValue - задает минимально допустимое значение компонента.
maxValue - задает максимально допустимое значение компонента.
minusId и plusId - аналогичны параметрам plusId и minusId в задании компонента

Компонент PlusMinusComponent связывается с элементом разметки при присвоении биндинге данных. Это происходит при создании таких компонентов как PANEL, PANEL_ENTER, RECYCLER и пр. Разметка для этих компонентов должна содержать элемент PlusMinus. Поэтому для списков (компоненты типа RECYCLER) функционал плюс - минус работает для каждого item-а. Естественно в данных должно быть поле соответствующее (по наименованию) элементу разметки PlusMinus. Если его не будет, то создастся поле с названием элемента разметки PlusMinus и значением равным минимальному значению заданному в PlusMinus.

Часто нужно не только увеличить\уменьшить значение, но и нужно его умножить на значение какого нибудь поля и результат поместить в другое поле. Для описания таких случаем используется список args элементы которого задаются следующим образом:

new Multiply(int viewId, String nameField, String nameFieldRes)

Здесь viewId - id элемента разметки в котором будет отображаться произведение. Если такого элемента нет то viewId = 0. Параметр nameField указывает на значение какого поля записи будет умножаться значение PlusMinus, а параметр nameFieldRes указывает в какое поле будет заноситься произведение. Если результат не нужен, то параметр nameFieldRes не указывается.

Пример использования приведен в уроках 3 и 7.

componentRecognizeVoice

Предназначен для распознавания речи.

Описание:

    .componentRecognizeVoice(microphone, search)

Здесь microphone - id элемента при клике на который запускается приложение, которое может обработать намерение для распознавания речи, оно вызывается операцией RecognizerIntent.ACTION_RECOGNIZE_SPEECH. search - id элемента в который заносится распознаный текст.

Пример использования приведен в уроке 6.

компонент типа RECYCLER

Это компонент, который позволяет создавать прокручиваемый список.

Объявляется стандартно. Типы могут быть следующими: RECYCLER - обычный список, RECYCLER_HORIZONTAL - горизонтальный, RECYCLER_GRID - две колонки. В остальном описание компонента одинаково для всех типов.

Задание модели и навигатора - стандартные.

Представление задается несколькими способами.

Самый простой:

view(int viewId, int layoutItemId) 

Здесь viewId - id элемента разметки RecyclerView; layoutItemId - id лайоута для item-мов прокручиваемого списка.

В случае если список имеет несколько типов item-мов:

view(int viewId, String fieldType, int[] layoutTypeId)

Здесь fieldType - название поля в записях в котором содержится значение типа item-ма. При этом: если fieldType будет строковым, то если его содержимое можно преобразовать в число, то результат будет это число. В противном случае если значение поля пустое (null или “”) то результат 0, иначе 1. Если строка fieldType эквивалентна “2”, то тип item-ма определяется таким образом: для четных позиций - 0 для нечетных - 1. В случае если fieldType отсутствует, то в качестве названия поля с типом item-мов принимается "select". Данный способ (fieldType = “2”) применяется если нужно четные и нечетные элементы показывать по разному, например с белым и серым фоном.

В массиве layoutTypeId находится перечень id лайоутов для item-мов прокручиваемого списка.

Для метода view можно использовать дополнительный функционал: .noDataView(int splashScreenViewId)

Если данных нет то будет показан элемент разметки с id равным splashScreenViewId.

Также представлению можно задать дополнительный функционал: .selected([int maxItemSelect])

Если нужно отмечать только один элемент списка, то параметр maxItemSelect не задается.

В этом случае при клике на какой либо элемент списка для него будет формироваться значение 1 в поле с именем "select" (если такого поля нет в исходных данных, то оно дополнится). При старте компонента ни один элемент списка не выделен. При повторных вызовах экрана с данным компонентом будет показываться предыдущее состояние выбора.

Если maxItemSelect задано и оно больше 0, то можно отметить одновременно не более maxItemSelect элементов списка.

Существуют случаи когда первоначально нужно установить выбранным элемент у которого некоторое поле имеет заданное значение, В этом случае используется вариант:

.selected(String selectNameField, String selectValueField)

Параметр selectNameField задает имя поля, а selectValueField - значение. Если параметр selectValueField отсутствует, то будет осуществляться проверка поля с именем selectNameField на равенство текущей локали.

Для отображения раскрывающихся списков нужно задать дополнительный функционал:

либо методом

.expanded(int expandedId, int rotateId, ParamModel paramModel)

либо методом

.expanded(int expandedId, int rotateId, String nameField)

Для каждого дополнительного уровня раскрытия указывается свой дополнительный функционал.

Здесь expandedId указывает при клике на какой элемент в item-ме будет раскрываться список. В rotateId задается элемент который будет отображать состояние раскрытия (проворачивается с анимацией).

Существует два способа получения информации для раскрывающегося списка: из внешнего источника (интернет, база данных) или из некоторого поля в исходном элементе списка.

Для первого случая в paramModel находятся параметры модели они задаются уже знакомым методом model(...).

Для второго случая в nameField задается название поля в котором находятся данные для раскрывающегося списка.

Пример использования приведен в уроках 1, 2, 4, 6, 7.

Тип - SEARCH.

Обеспечивает ввод текста, поиск данных с учетом введенного текста и отображение этих данных в виде списка. Описание:

    .componentSearch(search, model( . . . ), recycler[, hideRecycler, minLen, delayMillis])

Здесь search - id элемента разментки класса EditText в который вводится строка поиска; model - источник данных; recycler id элемента разментки, который соответствует компоненту типа RECYCLER; если hideRecycler = true, то перед выбором новых данных старые стираются; если количество символов в тексте меньше или равно minLen, то поиск не осуществляется; если пользователь не вводит данные в течение delayMillis миллисекунд, то начинается поиск (естественно если количество символов больше minLen).

Компонент componentSearch нужно описывать после компонента соответствующего recycler.

Следует учитывать, что элементу разметки search добавляется обработчик класса TextWatcher. Поэтому поиск может начаться если значение search изменится любым способом.

По модели компонента можно получать данные либо с свревера, либо с локальной базы данных. В первом случае модель имеет вид:

    model(url, param)

Здесь param - название параметра, которому будет присваиваться значение набранного текста. Метод может быть и POST.

Во втором:

    model(GET_DB, sql, paramOrField)

Здесь GET_DB - метод; sql запрос к базе, должен заканчиваться "WHERE "; paramOrField - перечень полей которые нужно проверять на близость к набраному тексту.

Например, если sql = "SELECT * FROM product WHERE " , paramOrField = "name,oem", а набранный текст будет "кард двиг", то к базе будет сформирован следующий запрос:

    SELECT * FROM product WHERE name LIKE '%кард%' OR oem LIKE '%кард% 
                             OR name LIKE '%двиг%' OR oem LIKE '%двиг%'

Пример использования приведен в уроке 6.

componentSequence

Тип - SEQUENCE.

    .componentSequence(intro, auth, main)

Если на экране есть componentSequence, то никаких других компонентов не должно быть.

В качестве параметров передаются названия активити которые будут выполняться последовательно: “интро”, “авторизация”, “main”. После полного выполнения каждой из активити при повторном старте приложения будет вызываться еще не выполненный элемент.

Каждое активити для указания, что оно полностью закончило необходимые действия должно выдать команду типа NEXT_SCREEN_SEQUENCE

Пример использования приведен в уроке 5.

компонент типа SPINNER

Обеспечивает возможность выбора элемента из выпадающего списка. Описание:

    .component(SPINNER, model( . . . ), view(spinner, item_spin_drop, item_spin_hider))

Здесь SPINNER - тип компонента, model задается стандартно, навигатор не предусмотрен. В view указываются: spinner - id элемента разментки класса Spinner, item_spin_drop - лайоут для элементов выпадающего списка, item_spin_hider - лайоут для заголовка спиннера.

При выборе нового элемента списка обновляются глобальные параметры значениями выбранной записи списка. Если на экране какой нибудь элемент установит R.id.spinner в параметре eventComponent, то при выборе нового элемента списаа для этого компонента будет осуществлено обновление данных.

Пример использования приведен в уроке 8.

componentSubscribe

Обеспечивает подписку \ отписку от действий сервера, в частности на пуши. Описание:

    .componentSubscribe(viewId, URL_SUBSCRIBE, URL_UNSUBSCRIBE)

Здесь viewId -id элемента типа переключатель, URL_SUBSCRIBE - строка с url запроса к серверу на подписку, URL_UNSUBSCRIBE - строка с url запроса к серверу на отписку.

В качестве переключателя можно использовать библиотечный элемент ComponSwitch, который описан в разделе "Дополнительные элементы разметки".

При переключении в состояние ON выполняется POST запрос URL_SUBSCRIBE на сервер. При этом в зависимости от значения параметра nameTokenPushInHeader (устанавливается в классе AppParams) токен будет передаваться либо в заголовке, либо в теле запроса. В случае ошибки при выполнении запроса переключатель устанавливается в состояние OFF. Аналогичные действия осуществляются при переключении в состояние OFF.

Компонент помнит выбранное пользователем состояние и устанавливает его при старте экрана.

switchComponent

Обеспечивает действия при изменении состояния элемента разметки типа Switch. Описание:

    switchComponent(viewId, navigator(...), navigator(...))

Здесь viewId -id элемента типа переключатель, первый navigator описывает действия при переключении в состояние ON, второй - в состояние OFF.

В качестве переключателя можно использовать библиотечный элемент ComponSwitch, который описан в разделе "Дополнительные элементы разметки".

Если при выполнении действий при смене состояния может произойти ошибка, например, на сервере, то нужно для таких ситуаций предусмотреть установку переключателя в предыдущие состояние, без выполнения действий. Это можно сделать обработчиком switchOnStatus(viewId, value). Если нужно установить состояние ON, то value = true, иначе value = false.

Компонент помнит выбранное пользователем состояние и устанавливает его при старте экрана.

componentTotal

Данный компонент применяется для отображения итоговых сумм по некоторым полям прокручиваемого списка (компонент типа RECYCLER).

Общий вид описания следующий:

    .componentTotal(viewId, viewIdWithList, viewEvent, visibil, nameFields)

Здесь viewId - id элемента в котором будет показываться сумма. Таким элементом может быть отдельный TextView для отображения итогов только по одному полю, либо, если нужно отобразить итоги по нескольким полям - ViewGroup (как правило это либо RelativeLayout, либо LinearLayout) в котором находятся элементы для отображения сумм.

Параметр viewIdWithList задает id элемента с которым связан список (компонент типа RECYCLER).

В параметре viewEvent указывается id элемента связанного с компонентом, который может изменять значения полей, по которым подводятся итогиt. Если такого компонента нет, то параметр можно пропустить. Если для этого используется компонент PlusMinusComponent, то он устанавливается для всех отображаемых элементов прокручиваемого списка.

Параметр visibil - управляет видимостью итогов. На данный момент функционал не реализован и нужно ставить null.

В параметре nameFields задается перечень полей записи по которым подводятся итоги, а следовательно, и id элементов для отображения сумм.

Пример использования приведен в уроках 3 и 7.

componentYoutube

Предназначен для показа видео (в активити и фрагменте). Описание:

    .componentYoutube(int viewId [, String source]) 

Здесь viewId как обычно id элемента разметки для компонента. В нашем случае нужно использовать класс библиотеки SimpleYouTubePlayer. Аттрибут у этого класса может быть только один - alias.

Параметр source задает имя файла для показа видео. Имя файла может быть задано в формате https://youtu.be/77o8DycDNo8 либо в формате https://youtu.be?name=77o8DycDNo8

Если source не указан, то адрес можно добавить с помощью .setValue(item(viewId, TS.PARAM, name_param)); Здесь viewId должно ссылаться на тот же элемент что и componentYoutube.

В классе MyAppParams нужно установить параметр youtubeApiKey (ссылка на строковую переменную с ключом для ютубе).

Пример использования приведен в уроках 1 и 2.



Лучше пакета DePro может быть только искусственный интеллект
Задать вопрос
Отправить вопрос