Pastaba: Šis straipsnis buvo pagrįstas „Material Components“ versija 1.2.0-beta01 nuo 2020 m. Birželio 1 d .



Per trejus su puse metų, kai dirbau mažoje „HASHTAGS“ „Android“ komandoje, vienas pagrindinių dalykų, motyvuojančių mane pradėti dirbti kiekvieną dieną, yra mūsų įmonės laisvė ir pasitikėjimas spręsti problemą bet kokiu, mūsų nuomone, geriausiu būdu.



Laisvė tyrinėti ir tirti daugybę įvairių problemų, kurios, mūsų manymu, yra būtinos, ir atsižvelgdama į laiko tarpą, per kurį turi būti pristatomi produktų atnaujinimai, leidžia mums rasti geriausią sprendimą tiek savo klientams, tiek mūsų programinei įrangai.

Vienas iš tokių iššūkių buvo NS sąsajos sukūrimas mūsų naujajai mobiliųjų ataskaitų funkcijai. Šis naujas komponentas buvo mėnesio parinkiklis, kuris leido mūsų vartotojams nustatyti analizės ataskaitos dienų seką.

Mūsų pasirinkta starto vieta buvo esama Medžiagos komponentų biblioteka . Užuot pradėjusi nuo nulio, ši biblioteka yra aktyviai prižiūrima ir derinama su medžiagos specifikacijomis. Turėdami šią biblioteką kaip pamatą, greičiausiai galėtume sumažinti logikos, kurią turėtume parašyti patys, kiekį.

Šiame straipsnyje aptarsiu, kaip mes priartėjome prie šio proceso, keletą unikalių veiksnių kuriant „Android“ programą „Sprout“, keletą „getchų“, kurios atsirado (ir buvo ištaisytos), ir ką reikėtų žinoti, jei esate dirbdamas prie panašaus projekto.

Įvadas

„Android“ medžiagų komponentai 1.1.0 Išleidimas pristatė naują „Date Picker“ vartotojo sąsajos komponentą. Vienas sveikintinų šio naujo MaterialDatePicker papildymų per „AppCompat“ CalendarView yra galimybė pasirinkti datų diapazoną naudojant kalendoriaus rodinį arba teksto įvesties lauką.



Senoji „AppCompat CalendarView“ nebuvo labai lanksti. Tai buvo geras komponentas riboto naudojimo atveju, kurį jis turėjo išspręsti; tai yra, pasirinkdami vieną datą ir pasirinktinas minimalias ir maksimalias datas, kad nurodytumėte leistiną dienų seką.

Naujasis „MaterialDatePicker“ buvo sukurtas lankstiau, kad būtų galima naudoti išplėstą elgesio funkcionalumą. Tai veikia per daugybę sąsajų, kurias būtų galima įdiegti, kad būtų galima pakoreguoti ir pakeisti rinkėjo elgesį.

Šis elgesio modifikavimas vykdymo metu atliekamas naudojant MaterialDatePicker.Builder kūrėjo modelio funkcijų rinkinį klasė.



Tai reiškia, kad mes galime išplėsti šio MaterialDatePicker pagrindinį elgesį per sudedamąsias sąsajos komponentus.

Pastaba: Nors yra daugybė skirtingų komponentų, MaterialDatePicker šiame straipsnyje aptarsime tik datos pasirinkimo komponentą.


skaičius 444, reiškiantis meilę

Dienų sekos parinkiklis

„HASHTAGS Android“ komanda kūrė „Analytics“ ataskaitų skyrių.

Ši nauja skiltis leis mūsų vartotojams pasirinkti filtrų rinkinį ir dienų sekų rinkinį, kurį apims ataskaita.

MaterialDatePicker buvo su kai kuriais iš anksto sukonstruotais komponentais, kuriuos galėtume panaudoti savo naudojimo atvejui pasiekti.

Dažniausiai pasitaikantis atvejis, kai vartotojui leidžiama pasirinkti datų diapazoną, iš anksto sukurtas MaterialDatePicker pakaktų:

Su šiuo kodų bloku gauname datos parinkiklį, kuris leidžia vartotojams pasirinkti dienų seką.

Mėnesio datos rinkiklis

Viena iš „HASHTAGS“ ataskaitų, kuriai parinkta unikalesnė data, yra „Twitter“ tendencijų ataskaita.

Ši ataskaita skiriasi nuo kitų tuo, kad užuot leidusi bet kokią dienų seką, ji taiko vieno mėnesio pasirinkimą, o tai reiškia, kad vartotojas gali pasirinkti tik 2020 m. Kovo mėn., Palyginti su 2020 m. Kovo 3–16 d.

Mūsų žiniatinklio programa tai tvarko naudodama išskleidžiamąjį formos lauką:

MaterialDatePicker neturi būdo priversti įgyvendinti tokį apribojimą su iš anksto sukurtu „Material Data Range Picker“, aptartu ankstesniame skyriuje. Laimei, „MaterialDatePicker“ buvo sukurta iš sudedamųjų dalių, leidžiančių išplėsti numatytąjį mūsų konkretaus naudojimo atvejo elgesį.

Datos pasirinkimo elgsena

MaterialDatePicker sveria a DateSelector kaip sąsaja, naudojama rinkėjo pasirinkimo logikai.

Iš „Javadoc“:

„Sąsaja {@link MaterialCalendar} vartotojams kontroliuoti, kaip Kalendorius rodo ir pateikia pasirinkimus ... “

Pastebėsite, kad MaterialDatePicker.Builder.dateRangePicker() pateikia statybininko RangeDateSelector egzempliorių, kurį panaudojome aukščiau pateiktame pavyzdyje.

Ši klasė yra iš anksto sukurtas selektorius, įgyvendinantis DateSelector

Protų šturmas kas mėnesį renkantis datą

Naudojimo atveju norėjome, kad vartotojai pasirinktų visą mėnesį kaip pasirinktą dienų seką; pvz. 2020 m. Gegužė, 2020 m. Balandis ir kt.

Manėme, kad iš anksto pastatytas RangeDateSelector aukščiau paminėtas kelias ten pateko. Komponentas leido vartotojui pasirinkti dienų seką ir priversti a surišti .

Trūko tik to, kaip priversti atranką automatiškai pasirinkti visą mėnesį. Numatytasis RangeDateSelector elgesys vartotojas turi pasirinkti pradžios datą ir pabaigos datą.

Mes norėjome elgtis taip, kad kai vartotojas pasirenka dieną mėnesyje, rinkėjas automatiškai pasirenka visą mėnesį kaip dienų seką.

Sprendimas, dėl kurio nusprendėme, buvo pratęsti RangeDateSelector tada pakeiskite dienos pasirinkimo elgseną, kad automatiškai pasirinktumėte visą mėnesį.

Laimei, yra funkcija, kurią galime nepaisyti iš sąsajos DateSelector paskambino: select(selection: Long).

Ši funkcija bus naudojama, kai vartotojas rinkiklyje pasirenka dieną, pasirinkta diena praeina UTC milisekundėmis nuo epochos.

Mėnesio datos pasirinkimo elgesio įgyvendinimas

Įgyvendinimas pasirodė paprasčiausia, nes mes turime aiškią funkciją, kurią galime nepaisyti, kad gautume norimą elgesį.

Pagrindinė logika bus tokia:

  1. Vartotojas pasirenka dieną.
  2. select() funkcija iškviečiama pasirinktą dieną a Ilgas UTC milisekundės nuo epochos.
  3. Raskite pirmą ir paskutinę mėnesio dieną nuo mums perduotos dienos.
  4. Paskambinkite į super.select(1st of month) & super.select(last day of month)
  5. Tėvų elgesys nuo RangeDateSelector turėtų veikti taip, kaip tikėtasi, ir pasirinkti dienų seką mėnesį.

Viską sujungus

Dabar, kai turime savo pasirinktinį MonthRangeDateSelector, galime nustatyti savo MaterialDatePicker

Toliau pateikdami pavyzdį, galime apdoroti pasirinkimo rezultatą taip:

Rezultatas atrodys taip:

Gotchas

Buvo tik viena svarbi problema, dėl kurios buvo sunku rasti šį sprendimą.

Pagrindiniai komponentai, naudojami kuriant mūsų MonthRangeDateSelector buvo klasė RangeDateSelector ir sąsaja DateSelector. Šiame straipsnyje naudojama bibliotekos versija (1.2.0-beta01) apribojo šių dviejų failų matomumą, neskatindama jų išplėsti ar įdiegti.

Todėl, nors mes galėjome sėkmingai sudaryti savo naująjį MonthRangeDateSelector, kompiliatorius parodė labai bauginantį perspėjimą, kad atgrasytų mus nuo to:

Vienas iš būdų paslėpti šį kompiliatoriaus įspėjimą yra pridėti @Suppress('RestrictedApi') patinka taip:

Ši patirtis rodo, kad, nors „Material Components Library“ pateikė „Android“ kūrėjų bendruomenei puikių naujų komponentų, ji vis dar vykdoma.

Puiki šios bibliotekos dalis yra atvirumas atsiliepimams iš „Android“ bendruomenės! Atradęs šį komponento matomumo apribojimą, atidariau sutrikimas dėl „Github“ projekto ir netgi atidarė a PR kad iš karto ją išspręstų.

Ši atvira grįžtamojo ryšio medžiaga tarp „Material Components“ komandos ir „Android“ bendruomenės sukuria puikų bendradarbiavimą ir rezultatus visiems.

Išvada

Naujas MaterialDatePicker turi keletą puikių funkcijų, kurios greičiausiai apims daugumą datos pasirinkimo naudojimo atvejų.

Tačiau geriausia jo dalis, pvz., „AppCompat CalendarView“, yra ta, kad ji sukurta sudėliotinai. Todėl ją galima lengvai išplėsti ir pritaikyti konkretiems naudojimo atvejams, tuo tarpu CalendarView.

Ypatingas ačiū

Norėčiau pabrėžti keletą žmonių, kurie padėjo recenzuoti šį straipsnį:

Dalykitės Su Savo Draugais: