MonoDroid.TimesSquare发布

之前看到Square发布了一个在Android上选择日期的widget,觉得挺不错的就想着把这个小项目移植到Mono for Android上。经过一段时间的开发,算完工了。代码库放在了GitHub上。

用法

CalendarPickerView作为custom view嵌入到layout里,像这样:

<monodroid.timessquare.CalendarPickerView
    android:id="@+id/calendar_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

对于layout还想多说几句。因为这个控件占用比较多的控件,所以最好给足空间。在屏幕小的设备上最好用对话框、全屏的fragment或者单独一个activity。屏幕够大的话倒是不推荐全屏显示,用一个fragment或者对话框就行了。

接着在activity/dialog里的 OnCreate 方法中或者fragment里的OnCreateView方法中,需要用一段有效的日期和当前选择的日期来实例化这个控件。比如像这样:

using Java.Util;
...

var nextYear = Calendar.Instance;
nextYear.Add (CalendarField.Year, 1);

var calendar = FindViewById (Resource.Id.calendar_view);
calendar.Init (new Date (), new Date (), nextYear.Time);

然后就可以用calendar.SelectedDate来得到所选择的日期。

实现细节

Square当时是如何想到写android-times-square这个小项目的可以看这里

Android上,用Java Calendar类(MonoDroid里有这个类的绑定)来计算日期。我们曾经考虑过用别的第三方库来实现,不过还是觉得让我们的库越小越好。在layout上,我们就自己写了个ListView:每行代表一个月,对于每个月再分别计算尺寸啥的,这样可以加快滚动速度。

下载

这里下载最新版本,然后以library project加到你的程序里。

软件许可

使用Apache 2.0许可。其实这倒是让我稍微补了一补课的地方。