どくぴーの備忘録

真面目なことを書こうとするクソメガネのブログ。いつ投げ捨てられるのかは不明

MultiSelectableCalendarなるライブラリを作った

github.com

Androidでカレンダーを操作する必要があったのですが,「この日はOK,この日はNG」みたいな指定の仕方が遷移なしでできるライブラリが無いなぁということになったのでいっそ自作して公開してみました

f:id:e10dokup:20161022015059g:plain

細かいことはリポジトリのREADME.mdを読むとわかるのですが

<dokup.xyz.multiselectablecalendar.ui.MultiSelectableCalenderView
        android:id="@+id/calender"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:monthBackgroundColor="#81D4FA" <!-- color of background parts for month -->
        app:monthTextColor="#546E7A" <!-- color of text for month -->
        app:weekBackgroundColor="#03A9F4" <!-- color of background parts for week -->
        app:weekTextColor="#FFFFFF" <!-- color of text for month -->
        app:dayBackgroundColor="#FFFFFF" <!-- color of background for date -->
        app:dayTextColor="#616161" <!-- color of text for date -->
        app:availableDayBackgroundColor="#FF9800" <!-- color of background for date which is available -->
        app:availableDayTextColor="#FFFFFF" <!-- color of text for date which is available -->
        app:unavailableDayBackgroundColor="#757575" <!-- color of background for date which is unavailable -->
        app:unavailableDayTextColor="#FFFFFF" <!-- color of text for date which is unavailable -->
        app:chevronColor="#1565C0" <!-- color of chevron for month change -->
        />

のようにほとんど全てのパーツについて色指定をできるようにしたり, ScheduleMode というenumを設定することで

  • ScheduleMode.SINGLE
    • OK/NG/特になしを日にちごとにタップすることで設定
    • available -> unavailable -> nothing -> available -> ...
  • ScheduleMode.RANGE
    • A日からB日までタップした範囲の全ての日付をOKにする
    • MultiSelectableCalendarView#setInterval(int interval) によって前後にNGの日にちを設定可能
  • ScheduleMode.DISPLAY
    • 操作不能の表示用モード

というように複数の表示モードを指定したりできるようにしてみました.

カレンダーで設定したOK/NGの日付一覧ですが,

AvailableSchedule schedule = calendarView.getAvailableSchedule // get AvailableSchedule instance
List<Calendar> available = schedule.getAvailableCalendarList(); // get available date as java.util.Calendar's list
List<Calendar> unavailable = schedule.getUnavailableCalendarList(); // get unavailable date as java.util.Calendar's list

のようにすることで java.util.Calendar のListとして取得できます.また MultiSelectableCalendarView#setOnScheduleChangedListener(OnScheduleChangedListener listener) のcallbackでも取得できます.

勉強になったこと

  • custom viewの実装
  • werckerによるデプロイまでのCI
    • 昨日やっとデプロイできるようになりました.というのもdocker imageを作れるだけのストレージに余裕がなかったので研究室のPCを借りてdocker hubにimageをpushするという()

PR/issueや「こここうした方がいいんじゃね」みたいな意見でもなんでもいいのでいただけると泣いて喜ぶと思うのでお願いします

くそおまけ

記事を書いている間に年齢がインクリメントしました.

https://www.amazon.co.jp/gp/registry/wishlist/22SFRRHYUCWKL