说实话,做了这么久还是第一次用到这个日期选择器,本来还以为要自己写一个,拿到需求后已经做好自定义的准备了,一百度才发现原来原生就有,而且和我们UI设计的基本一样,而且原生的看着也是挺好看的,心想算了,不写了,先完成需求再说把。
使用真实太简单了!!!
主要说两种实现方式,道理其实是一样的,看你喜欢怎么用了
一、新建类文件
1、新建一个类 继承 DialogFragment
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
private String TAG = DatePickerFragment.class.getCanonicalName();
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(), this, year, month, day);
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Log.e(TAG, "year:"+year+";monthOfYear:"+monthOfYear+";dayOfMonth:"+dayOfMonth);
}
}
2、在你的按钮onclick中
DatePickerFragment datePicker = new DatePickerFragment();
datePicker.show(getFragmentManager(), "DatePicker");
点击完成,看输出日记
E/com.xinxin.applicationtest.widget.DatePickerFragment: year:2016;monthOfYear:11;dayOfMonth:6
咦,是不是发现一个问题,12月,输出时变成11了
monthOfYear:11
月份在获取时,都是-1的返回,所以我们在使用时需要对月份进行+1的处理。
二、直接在点击的实现中,并且增加一个取消的按钮
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog picker = new DatePickerDialog(MainActivity.this, DatePickerListener, year, month, day);
picker.setCancelable(true);
picker.setCanceledOnTouchOutside(true);
picker.setButton(DialogInterface.BUTTON_POSITIVE, "确认",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//确定的逻辑代码
}
});
picker.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//取消什么也不用做
}
});
picker.show();
以上基本简单的使用已经实现了
-------------------------------------------------------------------华丽丽的分割线-----------------------------------------------------------------------
但是发现一个问题,不管是点击取消,还是确定,都会执行接口的回调,我们的设计是在点击取消的时候不获取时间,那要怎么实现呢?
修改上面的代码,把
DatePickerListener
的实现设置为null,日期我们在确定的回调中实现,看代码
Calendar calendar = Calendar.getInstance();
final DatePickerDialog datePicker = new DatePickerDialog(mContext, null,
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH));
datePicker.setCancelable(true);
datePicker.setCanceledOnTouchOutside(true);
datePicker.setButton(DialogInterface.BUTTON_POSITIVE, "确认",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//确定的逻辑代码在监听中实现
DatePicker picker = datePicker.getDatePicker();
int year = picker.getYear();
int monthOfYear = picker.getMonth();
int dayOfMonth = picker.getDayOfMonth();
}
});
datePicker.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//取消什么也不用做
}
});
确定的onClick的回调中,通过获取DatePicker来获取点击设置的日期,就这样,取消不会触发任何操作。
收工