android系统自带的日期控件真的是丑到爆,在日期的选择上都比较流行使用瀑布的方式,这里分享一个非常精致的开源时间瀑布。
先看效果图:
下载地址:
timesquere时间瀑布下载地址
下面介绍下使用方法:
首先下载类库,导入工程并关联到自己的工程上
注意项目是android studio的项目,如果要在eclipse中使用需要转换成eclipse工程,转换方法:
如何将android studio工程 转换为 eclipse工程
不想自己转的,我这里上传了一个已经转换成eclipse项目的类库,并根据自己项目的需求修改了显示的风格,就是如上第一张图:
timesquere时间瀑布(eclipse)下载地址
使用方法很简单,还能支持简单的自定义。
首先,在布局中添加控件的布局:
<com.squareup.timessquare.CalendarPickerView
android:id="@+id/calendar_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00000000"
android:clipToPadding="false"
android:paddingBottom="16dp" />
然后在自己的activity中初始化:
calendar = (CalendarPickerView) findViewById(R.id.calendar_view);
calendar.init(new Date(), TimeUtil.add(new Date(), Calendar.MONTH, 2))
.inMode(SelectionMode.SINGLE)
.withSelectedDate(new Date());
解释下方法和参数:
init()方法:2个参数分别是开始日期和结束日期;
inMode()方法:设置显示模式,这里是SINGLE模式,表示单选模式;
withSelectedDate():设置默认选中的日期;
上段代码直接放上去会保存,因为你没有TimeUtil,上面的add方法是获取当前日期后2个月的日期,下面上TimeUtil的add方法:
/**
* 日期加减
* @return
*/
public static Date add(Date date,int field,int value) {
gc.setTime(date);
gc.add(field, value);
return gc.getTime();
}
如果你希望并不是每天都可以选择,那么你可以设置一个日期过滤器,来过滤哪些日期可以选择,哪些不能:
calendar.setDateSelectableFilter(new DateSelectableFilter() {
@Override
public boolean isDateSelectable(Date date) {
//加入自己的逻辑
return true;
}
});
返回true表示可以选择,false则无法选择,在isDateSelectable的回调中加入自己的过滤逻辑,默认全反true。
设置点击事件监听,设置一个日期选择监听器:
calendar.setOnDateSelectedListener(new OnDateSelectedListener() {
@Override
public void onDateSelected(Date date) {
Toast.makeText(context, "您选择了:"+date, Toast.LENGTH_SHORT).show();
}
@Override
public void onDateUnselected(Date date) {
}
});
这样你就可以尝试着运行一下了。
如果你有特别的需求,比如你希望显示日期的格子里显示一些其他的数据,比如你发布一个旅游产品,选择日期的时候要在每天的格子控件中显示当天的价格。像这样:
timesquere引入了一种叫做“装饰器”的东西,其实就是一个接口:
public interface CalendarCellDecorator {
void decorate(CalendarCellView cellView, Date date);
}
你需要实现这个接口来实现自定义的展示效果
其中的第一个参数CalendarCellView 其实就是一个增强的TextView,你可以把它看做TextView,第二个参数是选择的日期,你可以通过SpannableString来设置文字的样式,然后把它设置到这个TextView里就可以了,下面是我的实现:
@Override
public void decorate(CalendarCellView cellView, Date date) {
String dateStr = Integer.toString(date.getDate());
SpannableString strSpan;
long time = today.getTime()-date.getTime();
if(cellView.isToday()){
dateStr = "今天";
}
strSpan = new SpannableString(dateStr + "\n¥200" );
strSpan.setSpan(new StyleSpan(Typeface.BOLD),
0,dateStr.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
strSpan.setSpan(new RelativeSizeSpan(0.8f),
dateStr.length(),strSpan.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
strSpan.setSpan(new ForegroundColorSpan(0xfff87b5c),
dateStr.length(),strSpan.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
cellView.setText(strSpan);
}
在每天的日期下面加一个橙色的“¥200”,并把今天的日期替换为“今天”字样。这里你要加入自己的处理逻辑,哪些日期需要不同的样式,哪些日期有特殊的效果等,我只是作一个例子介绍。