前段时间,因业务整合,有个需求是把原来可以选择年月日的弹窗改为仅选择年月。
重写原生的DatePickerDialog,设置DatePickerDialog的样式为年月日为滑动选择,隐藏日的选择,实现功能。
代码如下:
import android.app.DatePickerDialog;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.DatePicker;
/**
* @version: v1.0
* @description: 只选择年月的时间选择控件
* @author: 酥小鱼
* @date :2018/9/18
*/
public class YearMonthDatePickerDialog extends DatePickerDialog {
public YearMonthDatePickerDialog(Context context, int theme, OnDateSetListener callBack,
int year, int monthOfYear, int dayOfMonth) {
//主题样式最好是指定的样式,比如这样的样式:DatePickerDialog.THEME_HOLO_LIGHT,因为在小米手机中会显示不同的弹窗日期样式甚至有的会报错崩溃
super(context, DatePickerDialog.THEME_HOLO_LIGHT, callBack, year, monthOfYear, dayOfMonth);
setTitle(year + "年" + (monthOfYear + 1) + "月");
try {
((ViewGroup) ((ViewGroup) (getDatePicker().getChildAt(0))).getChildAt(0)).getChildAt(2)
.setVisibility(View.GONE);
}catch (Exception e){
e.printStackTrace();
}
}
public YearMonthDatePickerDialog(Context context, OnDateSetListener callBack, int year,
int monthOfYear, int dayOfMonth) {
super(context, callBack, year, monthOfYear, dayOfMonth);
}
@Override
public void onDateChanged(DatePicker view, int year, int month, int day) {
super.onDateChanged(view, year, month, day);
setTitle(year + "年" + (month + 1) + "月");
}
}
具体使用:
//获取当前日期
Calendar calendar = Calendar.getInstance();
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH);
day = calendar.get(Calendar.DAY_OF_MONTH);
YearMonthDatePickerDialog dpd = new YearMonthDatePickerDialog(NewFpyjActivity.this
, 3, dateListener, year, month, day);
dpd.show();
/**
* 定义日期的监听
*/
private DatePickerDialog.OnDateSetListener dateListener = new DatePickerDialog.OnDateSetListener() {
/**params:view:该事件关联的组件
* params:myyear:当前选择的年
* params:monthOfYear:当前选择的月
* params:dayOfMonth:当前选择的日
*/
@Override
public void onDateSet(DatePicker view, int myyear, int monthOfYear, int dayOfMonth) {
//修改year、month、day的变量值,以便以后单击按钮时,DatePickerDialog上显示上一次修改后的值
year = myyear;
month = monthOfYear + 1;
day = dayOfMonth;
if (month > 9){
txtNewKprq.setText(year + "-" + month);
txtNewKprq.setTextColor(getResources().getColor(R.color.fpyj_bszn_text_color));
}else {
txtNewKprq.setText(year + "-0" + month);
txtNewKprq.setTextColor(getResources().getColor(R.color.fpyj_bszn_text_color));
}
}
};
简单解释下以上代码:那个判断月份是因为没有将得到的日期进行格式化(后期我进行了优化,private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); sdf.format(date)即可),因为这个选择框选择的数据如果是2018.9.28,返回的是2018-9,我需要的是2018-09
一切ok,调整为滑动选择年月的弹窗样式,我拿自己手机进行了测试,弹出的仍然是点击选择的样式弹窗,因为我手机是7.0的系统,而且是小米手机,不确定问题所在,拿其他手机测试了一下,最终确定是小米手机的坑(国内的定制很坑爹),因为拿华为手机,无论是6.0还是8.0都很nice,实现功能和效果。很烦,指定了一下样式,并没有解决问题。如果你知道怎么解决,欢迎告诉我。
换了个坑,不想太麻烦的重写,就只能找现有的轮子了,选择了PickerView
GitHub地址:https://github.com/Bigkoo/Android-PickerView
具体使用(代码如下):
private void showDatePicker() {
Calendar selectedDate = Calendar.getInstance();
Calendar startDate = Calendar.getInstance();
//startDate.set(2013,1,1);
Calendar endDate = Calendar.getInstance();
//endDate.set(2020,1,1);
//正确设置方式 原因:注意事项有说明
startDate.set(2013, 0, 1);
endDate.set(2020, 11, 31);
TimePickerView pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {//选中事件回调
txtNewKprq.setText(sdf.format(date));
txtNewKprq.setTextColor(getResources().getColor(R.color.fpyj_bszn_text_color));
}
})
.setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
.setCancelText("取消")//取消按钮文字
.setSubmitText("确认")//确认按钮文字
.setTitleSize(20)//标题文字大小
.setTitleText("")//标题文字
.setOutSideCancelable(true)//点击屏幕,点在控件外部范围时,是否取消显示
.isCyclic(true)//是否循环滚动
.setTitleColor(Color.BLACK)//标题文字颜色
.setSubmitColor(getResources().getColor(R.color.fpyj_second_phase_color))//确定按钮文字颜色
.setCancelColor(getResources().getColor(R.color.fpyj_second_phase_color))//取消按钮文字颜色
.setTitleBgColor(Color.WHITE)//标题背景颜色 Night mode
.setBgColor(Color.WHITE)//滚轮背景颜色 Night mode
.setDate(selectedDate)// 如果不设置的话,默认是系统时间*/
.setRangDate(startDate, endDate)//起始终止年月日设定
.setLabel("年", "月", "日", "时", "分", "秒")//默认设置为年月日时分秒
.isCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。
.isDialog(true)//是否显示为对话框样式
.build();
pvTime.show();
}
这个注释写的很清楚明白,具体可参照GitHub,内容已经很详细了。
欢迎访问交流群:589780530