Сазнајте Свој Број Анђела
Инжењеринг у Спроут-у: Изградња берача за Андроид месец
Напомена: Овај чланак је заснован на верзији Материјалне компоненте 1.2.0-бета01 од 1. јуна 2020 .
Током моје три и по године рада у малом Андроид тиму у ХАСХТАГС-у, једна од главних ствари која ме мотивише да свакодневно долазим на посао је слобода и поверење наше компаније у решавању проблема на било који начин који сматрамо најбољим.
Слобода да истражујемо и истражујемо многа различита решења проблема за који сматрамо да је неопходан, иако узимајући у обзир временски оквир за испоруку ажурирања производа, омогућава нам да пронађемо најбоље решење и за наше купце и за наш софтвер.
Један такав изазов подразумевао је изградњу корисничке компоненте за нашу нову функцију мобилног извештавања. Ова нова компонента била је бирач месеца, што је нашим корисницима омогућило да опсег периода за аналитички извештај.

Почетно место које смо изабрали било је постојеће Библиотека компонената материјала . Уместо да започне од нуле, ова библиотека се активно одржава и усклађује са спецификацијама материјала. Са овом библиотеком као темељем, вероватно бисмо могли смањити количину логике коју бисмо морали сами да напишемо.
У овом чланку ћу описати како смо приступили овом процесу, неке јединствене факторе у изради апликације Спроут за Андроид, неколико „потешкоћа“ које су се појавиле (и биле су поправљене) успут и шта треба знати ако сте радећи на сличном пројекту.
Увод
Компоненте Андроид материјала 1.1.0 Издање представио нову компоненту корисничког интерфејса бирача датума. Један од добродошлих додатака овог новог MaterialDatePicker
преко АппЦомпат-а CalendarView
је могућност одабира распона датума помоћу приказа календара или поља за унос текста.
Стари АппЦомпат ЦалендарВиев није био превише флексибилан. То је била добра компонента за случај ограничене употребе који је требало да се реши; то јест, одабир једног датума и необавезних минималних и максималних датума за одређивање дозвољеног ограниченог распона датума.
Нови МатериалДатеПицкер направљен је са више флексибилности како би омогућио употребу проширене функционалности понашања. Ради кроз низ интерфејса које би неко могао применити да би прилагодио и изменио понашање бирача.
Ова модификација понашања врши се током извођења кроз скуп функција обрасца градитеља на MaterialDatePicker.Builder
класа.
То значи да смо у могућности да проширимо основно понашање овог MaterialDatePicker
кроз компоноване компоненте интерфејса.
Напомена: Иако постоји низ различитих компонената, MaterialDatePicker
користи, у овом чланку ћемо обрађивати само компоненту за одабир датума.
111 љубавно значење
Бирач временског периода
Андроид тим ХАСХТАГС је био у процесу израде нашег одељка за извештаје Аналитике.
Овај нови одељак омогућио би нашим корисницима да одаберу скуп филтера и скуп распона датума које би извештај обухватио.


Тхе MaterialDatePicker
долази са неким унапред изграђеним компонентама које бисмо могли искористити да бисмо остварили свој случај употребе.
За наш најчешћи случај, који омогућава кориснику да одабере опсег датума, унапред изграђени MaterialDatePicker
било би довољно:
Овим блоком кода добијамо бирач датума који омогућава корисницима да одаберу период.

Месечни бирач датума
Један од извештаја ХАСХТАГС-а који има јединственији избор датума је Твиттер Трендс Репорт.
Овај извештај се разликује од осталих по томе што уместо да дозвољава било који период, он намеће једномесечни избор, што значи да корисник може да изабере само март 2020. у односу на 3. и 16. март 2020.
Наша веб апликација то решава помоћу падајућег поља обрасца:

Тхе MaterialDatePicker
нема начин да изврши такво ограничење помоћу унапред изграђеног бирача временског распона материјала који је разматран у претходном одељку. Срећом, МатериалДатеПицкер је направљен од делова који се могу саставити и који нам омогућавају да проширимо подразумевано понашање за наш одређени случај употребе.
Понашање избора датума
Тхе MaterialDatePicker
користи а DateSelector
као интерфејс који се користи за логику избора бирача.
Из Јавадоц-а:
„Интерфејс за кориснике {@link MaterialCalendar}
да контролише како Календар приказује и враћа изборе ... “
Приметићете да MaterialDatePicker.Builder.dateRangePicker()
враћа градитељску инстанцу RangeDateSelector
, коју смо користили у горњем примеру.
Ова класа је унапред изграђени селектор који примењује DateSelector
.
Размишљање о понашању при одабиру датума месечно
За наш случај употребе, желели смо начин да корисници одаберу читав месец као изабрани период; на пример. Мај 2020. април 2020. итд.
Мислили смо да је унапред изграђена RangeDateSelector
горе поменута довела нас је до већине пута тамо. Компонента је кориснику омогућила да одабере опсег датума и примени а везан .
Једино што је недостајало био је начин да се изврши избор да се аутоматски бира цео месец. Подразумевано понашање RangeDateSelector
да корисник изабере датум почетка и датум завршетка.
Желели смо понашање тако да када корисник одабере дан у месецу, бирач ће аутоматски одабрати читав месец као период.

Решење за које смо се одлучили било је продужити RangeDateSelector
а затим замените понашање избора дана да бисте уместо тога аутоматски изабрали цео месец.
Срећом, постоји функција коју можемо надјачати са интерфејса DateSelector
под називом: select(selection: Long)
.
Ова функција ће се позвати када корисник одабере дан у бирачу, а изабрани дан се прослеђује у УТЦ милисекундама од епохе.
Примена понашања за одабир датума месечно
Испоставило се да је примена најједноставнији део, јер имамо јасну функцију коју можемо надјачати да бисмо постигли понашање које желимо.
Основна логика биће следећа:
- Корисник бира дан.
- Тхе
select()
функција се позива са изабраним даном у а Дуго УТЦ милисекунде од епохе. - Пронађите први и последњи дан у месецу од датог дана који нам је прослеђен.
- Позовите
super.select(1st of month)
&super.select(last day of month)
- Понашање родитеља из
RangeDateSelector
требало би да ради према очекивањима и одаберите месец као период.
Све састављање
Сада када имамо наш Прилагођени MonthRangeDateSelector
, можемо да поставимо MaterialDatePicker
.
Да узмемо пример даље, резултат избора можемо обрадити овако:
Резултат ће изгледати овако:

Имам те
Постојало је само једно главно питање због којег је било тешко доћи до овог решења.
Примарне компоненте коришћене за изградњу нашег MonthRangeDateSelector
били класа RangeDateSelector
и интерфејс DateSelector
. Верзија библиотеке коришћена у овом чланку (1.2.0-бета01) ограничила је видљивост ове две датотеке како би обесхрабрила њихово проширење или примену.
Као резултат, иако смо могли успешно да компајлирамо наш нови MonthRangeDateSelector
, преводилац је показао врло застрашујуће упозорење да нас одврати од тога:

Један од начина да сакријете ово упозорење компајлера је додавање @Suppress('RestrictedApi')
овако:

Ово искуство илуструје како, иако је библиотека материјалних компоненти обезбедила неке сјајне нове компоненте заједници програмера Андроид-а, то још увек ради.
Велики део ове библиотеке је отвореност за повратне информације од Андроид заједнице! Након откривања овог ограничења видљивости компоненте, отворио сам питање на пројекту Гитхуб, па чак и отворио а ПР да се то одмах обрати.
Ова отворена петља повратних информација између тима за материјалне компоненте и Андроид заједнице даје сјајну сарадњу и резултате за све.
Закључак
Нови MaterialDatePicker
има неку изванредну функционалност која ће вероватно покрити већину случајева избора датума.
Међутим, најбољи део њега, попут нечега попут АппЦомпат ЦалендарВиев, је тај што је направљен на начин који се може компоновати. Због тога се може лако проширити и модификовати за одређене случајеве употребе, док би било много теже постићи такве ствари у CalendarView
Посебну захвалност
Желео бих да истакнем неке људе који су помогли у рецензији овог чланка:
- Ницк Роут ( Гитхуб )
- Мике Волфсон ( Гитхуб )
- Риан Пхиллипс ( ЛинкедИн )
- Луцас Моеллерс ( Гитхуб )
- Са Пателом ( ЛинкедИн )
Подели Са Пријатељима: