Finden Sie Ihre Anzahl Von Engel Heraus
Engineering bei Sprout: Erstellen eines Android-Monats-Pickers
Hinweis: Dieser Artikel basiert auf der Version Material Materials 1.2.0-beta01 ab 1. Juni 2020 .
In meinen dreieinhalb Jahren in einem kleinen Android-Team bei HASHTAGS ist eines der wichtigsten Dinge, die mich motivieren, jeden Tag zur Arbeit zu kommen, die Freiheit und das Vertrauen unseres Unternehmens, ein Problem so anzugehen, wie wir es für am besten halten.
Die Freiheit, viele verschiedene Lösungen für ein Problem zu erforschen und zu erforschen, die wir für notwendig halten, und gleichzeitig einen Zeitrahmen für die Bereitstellung von Produktupdates zu berücksichtigen, ermöglicht es uns, die beste Lösung sowohl für unsere Kunden als auch für unsere Software zu finden.
Eine solche Herausforderung bestand darin, eine UI-Komponente für unsere neue Funktion für mobile Berichte zu erstellen. Diese neue Komponente war eine Monatsauswahl, mit der unsere Benutzer einen Datumsbereich für einen Analysebericht festlegen konnten.

Der Startplatz, den wir ausgewählt haben, war der vorhandene Materialkomponentenbibliothek . Anstatt von vorne zu beginnen, wird diese Bibliothek aktiv gepflegt und richtet sich nach den Materialspezifikationen. Mit dieser Bibliothek als Grundlage könnten wir wahrscheinlich die Menge an Logik reduzieren, die wir selbst schreiben müssten.
In diesem Artikel werde ich erläutern, wie wir diesen Prozess angegangen sind, einige einzigartige Faktoren beim Erstellen der Sprout Android-App, einige „Fallstricke“, die auf dem Weg aufgetaucht sind (und behoben wurden), und was Sie wissen sollten, wenn Sie es sind an einem ähnlichen Projekt arbeiten.
Einführung
Die Android-Materialkomponenten 1.1.0 Release Einführung einer neuen Datumsauswahl-UI-Komponente. Eine der willkommenen Ergänzungen dieses neuen MaterialDatePicker
über den AppCompat CalendarView
ist die Möglichkeit, einen Datumsbereich mithilfe einer Kalenderansicht oder eines Texteingabefelds auszuwählen.
Das alte AppCompat CalendarView war nicht sehr flexibel. Es war eine gute Komponente für den begrenzten Anwendungsfall, den es lösen sollte; Das heißt, Sie wählen ein einzelnes Datum und optionale minimale und maximale Daten aus, um einen zulässigen gebundenen Datumsbereich anzugeben.
Der neue MaterialDatePicker wurde mit mehr Flexibilität erstellt, um die Verwendung erweiterter Verhaltensfunktionen zu ermöglichen. Es funktioniert über eine Reihe von Schnittstellen, die implementiert werden können, um das Verhalten des Pickers zu optimieren und zu modifizieren.
Diese Verhaltensänderung wird zur Laufzeit über eine Reihe von Builder-Musterfunktionen auf dem MaterialDatePicker.Builder
durchgeführt Klasse.
Dies bedeutet, dass wir das Basisverhalten dieses MaterialDatePicker
erweitern können durch zusammensetzbare Schnittstellenkomponenten.
Hinweis: Während es eine Reihe verschiedener Komponenten gibt, ist MaterialDatePicker
In diesem Artikel wird nur die Datumsauswahlkomponente behandelt.
101 Bedeutung Numerologie
Datumsbereichsauswahl
Das Android-Team von HASHTAGS war dabei, unseren Bereich für Analytics-Berichte zu erstellen.
In diesem neuen Abschnitt können unsere Benutzer eine Reihe von Filtern und Datumsbereichen auswählen, die der Bericht abdecken würde.


Die MaterialDatePicker
Es wurden einige vorgefertigte Komponenten mitgeliefert, mit denen wir unseren Anwendungsfall erfüllen können.
In unserem häufigsten Fall, in dem ein Benutzer einen Bereich von Daten auswählen kann, ist das vorgefertigte MaterialDatePicker
würde genügen:
Mit diesem Codeblock erhalten wir eine Datumsauswahl, mit der Benutzer einen Datumsbereich auswählen können.

Monatliche Datumsauswahl
Einer der HASHTAGS-Berichte mit einer eindeutigeren Datumsauswahl ist der Twitter Trends Report.
Dieser Bericht unterscheidet sich von den anderen darin, dass er keinen Datumsbereich zulässt, sondern eine Auswahl für einen einzelnen Monat erzwingt. Dies bedeutet, dass ein Benutzer nur den März 2020 gegenüber dem 3. März bis zum 16. März 2020 auswählen kann.
Unsere Web-App erledigt dies mithilfe eines Dropdown-Formularfelds:

Die MaterialDatePicker
hat keine Möglichkeit, eine solche Einschränkung mit dem im vorherigen Abschnitt beschriebenen vorgefertigten Material Date Range Range Picker durchzusetzen. Glücklicherweise wurde MaterialDatePicker mit zusammensetzbaren Teilen erstellt, mit denen wir das Standardverhalten für unseren speziellen Anwendungsfall erweitern können.
Datumsauswahlverhalten
Die MaterialDatePicker
nutzt a DateSelector
als Schnittstelle für die Auswahllogik des Pickers.
Aus dem Javadoc:
“Schnittstelle für Benutzer von {@link MaterialCalendar}
um zu steuern, wie der Kalender Auswahlen anzeigt und zurückgibt… “
Sie werden feststellen, dass MaterialDatePicker.Builder.dateRangePicker()
Gibt eine Builder-Instanz von RangeDateSelector
zurück, die wir im obigen Beispiel verwendet haben.
Diese Klasse ist ein vorgefertigter Selektor, der DateSelector
implementiert.
Brainstorming eines monatlichen Datumsauswahlverhaltens
Für unseren Anwendungsfall wollten wir, dass unsere Benutzer einen ganzen Monat als ausgewählten Datumsbereich auswählen. z.B. Mai 2020, April 2020 usw.
Wir dachten, dass die vorgefertigten RangeDateSelector
Das oben genannte hat uns den größten Teil des Weges dorthin gebracht. Mit der Komponente konnte ein Benutzer einen Datumsbereich auswählen und a erzwingen gebunden .
Das einzige, was fehlte, war eine Möglichkeit, eine Auswahl zu erzwingen, um den gesamten Monat automatisch auszuwählen. Das Standardverhalten von RangeDateSelector
Der Benutzer wählt ein Startdatum und ein Enddatum aus.
Wir wollten ein Verhalten, bei dem ein Benutzer bei der Auswahl eines Tages im Monat automatisch den gesamten Monat als Datumsbereich auswählt.

Die Lösung, für die wir uns entschieden haben, war die Erweiterung von RangeDateSelector
und überschreiben Sie dann das Verhalten bei der Tagesauswahl, um stattdessen automatisch den gesamten Monat auszuwählen.
Glücklicherweise gibt es eine Funktion, die wir über die Schnittstelle DateSelector
überschreiben können aufgerufen: select(selection: Long)
.
Diese Funktion wird aufgerufen, wenn ein Benutzer einen Tag in der Auswahl auswählt, wobei der ausgewählte Tag in UTC-Millisekunden ab der Epoche verstrichen ist.
Implementierung eines monatlichen Datumsauswahlverhaltens
Die Implementierung erwies sich als der einfachste Teil, da wir eine klare Funktion haben, die wir überschreiben können, um das gewünschte Verhalten zu erzielen.
Die grundlegende Logik wird folgende sein:
- Der Benutzer wählt einen Tag aus.
- Die
select()
Die Funktion wird mit dem ausgewählten Tag in a aufgerufen Lange UTC Millisekunden von der Epoche. - Finden Sie den ersten und letzten Tag des Monats ab dem angegebenen Tag, der an uns übergeben wurde.
- Rufen Sie
super.select(1st of month)
an &super.select(last day of month)
- Das übergeordnete Verhalten von
RangeDateSelector
sollte wie erwartet funktionieren und den Monat als Datumsbereich auswählen.
Alles zusammenfügen
Nachdem wir unser benutzerdefiniertes MonthRangeDateSelector
haben, können wir unser MaterialDatePicker
einrichten.
Um das Beispiel weiter zu führen, können wir das Ergebnis der Auswahl folgendermaßen verarbeiten:
Das Ergebnis sieht folgendermaßen aus:

Fallstricke
Es gab nur ein Hauptproblem, das es schwierig machte, zu dieser Lösung zu gelangen.
Die Hauptkomponenten, die zum Erstellen unserer MonthRangeDateSelector
verwendet wurden waren die Klasse RangeDateSelector
und die Schnittstelle DateSelector
. Die in diesem Artikel verwendete Version der Bibliothek (1.2.0-beta01) hat die Sichtbarkeit dieser beiden Dateien eingeschränkt, um deren Erweiterung oder Implementierung zu verhindern.
Obwohl wir unser neues MonthRangeDateSelector
erfolgreich kompilieren konnten, zeigte der Compiler eine sehr beängstigende Warnung, um uns davon abzuhalten:

Eine Möglichkeit, diese Compiler-Warnung auszublenden, besteht darin, ein @Suppress('RestrictedApi')
hinzuzufügen wie so:

Diese Erfahrung zeigt, dass die Material Components Library, obwohl sie der Android Developer Community einige großartige neue Komponenten zur Verfügung gestellt hat, noch in Arbeit ist.
Ein großer Teil dieser Bibliothek ist die Offenheit für Feedback aus der Android Community! Nachdem ich diese Einschränkung der Sichtbarkeit von Komponenten entdeckt hatte, öffnete ich eine Problem auf dem Github-Projekt und eröffnete sogar eine PR um es sofort anzusprechen.
Diese offene Rückkopplungsschleife zwischen dem Material Components Team und der Android Community führt zu einer großartigen Zusammenarbeit und Ergebnissen für alle.
Fazit
Das neue MaterialDatePicker
verfügt über einige großartige sofort einsatzbereite Funktionen, die wahrscheinlich die meisten Anwendungsfälle der Datumsauswahl abdecken.
Das Beste an AppCompat CalendarView ist jedoch, dass es auf komponierbare Weise erstellt wurde. Daher kann es leicht erweitert und für bestimmte Anwendungsfälle modifiziert werden, während es viel schwieriger wäre, solche Dinge in CalendarView
zu erreichen.
Besonderer Dank
Ich möchte einige Leute hervorheben, die bei der Begutachtung dieses Artikels geholfen haben:
- Nick Rout ( Github )
- Mike Wolfson ( Github )
- Ryan Phillips ( LinkedIn )
- Lucas Moellers ( Github )
- Mit Patel ( LinkedIn )
Teile Mit Deinen Freunden: