|
|
|
@ -28,10 +28,18 @@ import android.view.View;
|
|
|
|
|
import android.widget.FrameLayout;
|
|
|
|
|
import android.widget.NumberPicker;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 日期选择器,是 [FrameLayout] 的子类
|
|
|
|
|
*/
|
|
|
|
|
public class DateTimePicker extends FrameLayout {
|
|
|
|
|
|
|
|
|
|
private static final boolean DEFAULT_ENABLE_STATE = true;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 常量声明,包含一些数值范围等
|
|
|
|
|
* 例如小时可选范围为0~23小时
|
|
|
|
|
* 分钟可选范围为0~59分钟
|
|
|
|
|
*/
|
|
|
|
|
private static final int HOURS_IN_HALF_DAY = 12;
|
|
|
|
|
private static final int HOURS_IN_ALL_DAY = 24;
|
|
|
|
|
private static final int DAYS_IN_ALL_WEEK = 7;
|
|
|
|
@ -46,25 +54,59 @@ public class DateTimePicker extends FrameLayout {
|
|
|
|
|
private static final int AMPM_SPINNER_MIN_VAL = 0;
|
|
|
|
|
private static final int AMPM_SPINNER_MAX_VAL = 1;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 天数选择器
|
|
|
|
|
*/
|
|
|
|
|
private final NumberPicker mDateSpinner;
|
|
|
|
|
/**
|
|
|
|
|
* 时间选择器
|
|
|
|
|
*/
|
|
|
|
|
private final NumberPicker mHourSpinner;
|
|
|
|
|
/**
|
|
|
|
|
* 分钟选择器
|
|
|
|
|
*/
|
|
|
|
|
private final NumberPicker mMinuteSpinner;
|
|
|
|
|
/**
|
|
|
|
|
* AM / PM 早晚选择器
|
|
|
|
|
*/
|
|
|
|
|
private final NumberPicker mAmPmSpinner;
|
|
|
|
|
/**
|
|
|
|
|
* 日期实例对象
|
|
|
|
|
*/
|
|
|
|
|
private Calendar mDate;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 日期显示的数值
|
|
|
|
|
*/
|
|
|
|
|
private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK];
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 是否是早晨
|
|
|
|
|
*/
|
|
|
|
|
private boolean mIsAm;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 是否是24小时制
|
|
|
|
|
*/
|
|
|
|
|
private boolean mIs24HourView;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 是否启用
|
|
|
|
|
*/
|
|
|
|
|
private boolean mIsEnabled = DEFAULT_ENABLE_STATE;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 是否正在初始化中
|
|
|
|
|
*/
|
|
|
|
|
private boolean mInitialising;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 日期变更监听器
|
|
|
|
|
*/
|
|
|
|
|
private OnDateTimeChangedListener mOnDateTimeChangedListener;
|
|
|
|
|
|
|
|
|
|
private NumberPicker.OnValueChangeListener mOnDateChangedListener = new NumberPicker.OnValueChangeListener() {
|
|
|
|
|
/**
|
|
|
|
|
* 数值改变监听器
|
|
|
|
|
*
|
|
|
|
|
* 在数值更改时同步修改 mDate 的数值
|
|
|
|
|
* 并刷新选择器的数值
|
|
|
|
|
* 触发时间改变监听器
|
|
|
|
|
*/
|
|
|
|
|
private NumberPicker.OnValueChangeListener mOnDateChangedListener =
|
|
|
|
|
new NumberPicker.OnValueChangeListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
|
|
|
|
|
mDate.add(Calendar.DAY_OF_YEAR, newVal - oldVal);
|
|
|
|
@ -72,8 +114,13 @@ public class DateTimePicker extends FrameLayout {
|
|
|
|
|
onDateTimeChanged();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() {
|
|
|
|
|
/**
|
|
|
|
|
* 数值改变监听器
|
|
|
|
|
*
|
|
|
|
|
* 在数值改变时传入选择器对象和操作前与操作后的数值
|
|
|
|
|
* 对数值进行具体的分析
|
|
|
|
|
*/
|
|
|
|
|
private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener(){
|
|
|
|
|
@Override
|
|
|
|
|
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
|
|
|
|
|
boolean isDateChanged = false;
|
|
|
|
@ -114,7 +161,9 @@ public class DateTimePicker extends FrameLayout {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 分钟改变监听器
|
|
|
|
|
*/
|
|
|
|
|
private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
|
|
|
|
@ -143,7 +192,10 @@ public class DateTimePicker extends FrameLayout {
|
|
|
|
|
onDateTimeChanged();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 早晚变更的监听器
|
|
|
|
|
* 在选择AM / PM的时候通知监听器触发方法
|
|
|
|
|
*/
|
|
|
|
|
private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
|
|
|
|
@ -185,7 +237,7 @@ public class DateTimePicker extends FrameLayout {
|
|
|
|
|
|
|
|
|
|
mHourSpinner = (NumberPicker) findViewById(R.id.hour);
|
|
|
|
|
mHourSpinner.setOnValueChangedListener(mOnHourChangedListener);
|
|
|
|
|
mMinuteSpinner = (NumberPicker) findViewById(R.id.minute);
|
|
|
|
|
mMinuteSpinner = (NumberPicker) findViewById(R.id.minute);
|
|
|
|
|
mMinuteSpinner.setMinValue(MINUT_SPINNER_MIN_VAL);
|
|
|
|
|
mMinuteSpinner.setMaxValue(MINUT_SPINNER_MAX_VAL);
|
|
|
|
|
mMinuteSpinner.setOnLongPressUpdateInterval(100);
|
|
|
|
@ -475,11 +527,19 @@ public class DateTimePicker extends FrameLayout {
|
|
|
|
|
public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) {
|
|
|
|
|
mOnDateTimeChangedListener = callback;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 在日期时间改变时调用该方法
|
|
|
|
|
* 如果日期时间改变监听器为空则不处理
|
|
|
|
|
* 不为空则调用监听器的方法
|
|
|
|
|
*/
|
|
|
|
|
private void onDateTimeChanged() {
|
|
|
|
|
if (mOnDateTimeChangedListener != null) {
|
|
|
|
|
mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(),
|
|
|
|
|
getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute());
|
|
|
|
|
}
|
|
|
|
|
if (mOnDateTimeChangedListener == null) return;
|
|
|
|
|
mOnDateTimeChangedListener.onDateTimeChanged(this,
|
|
|
|
|
getCurrentYear(),
|
|
|
|
|
getCurrentMonth(),
|
|
|
|
|
getCurrentDay(),
|
|
|
|
|
getCurrentHourOfDay(),
|
|
|
|
|
getCurrentMinute()
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|