|
|
|
@ -19,6 +19,7 @@ package net.micode.notes.ui;
|
|
|
|
|
import java.text.DateFormatSymbols;
|
|
|
|
|
import java.util.Calendar;
|
|
|
|
|
import net.micode.notes.R;
|
|
|
|
|
import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener;
|
|
|
|
|
import android.content.Context;
|
|
|
|
|
import android.text.format.DateFormat;
|
|
|
|
|
import android.view.View;
|
|
|
|
@ -142,21 +143,24 @@ public class DateTimePicker extends FrameLayout {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//hour改变对日期的影响
|
|
|
|
|
// 如果偏移量不为零,则通过添加偏移量(以小时为单位)来调整日期
|
|
|
|
|
if (offset != 0) {
|
|
|
|
|
mDate.add(Calendar.HOUR_OF_DAY, offset);
|
|
|
|
|
mHourSpinner.setValue(getCurrentHour());
|
|
|
|
|
updateDateControl();
|
|
|
|
|
mDate.add(Calendar.HOUR_OF_DAY, offset);// 更新小时选择器以反映当前小时
|
|
|
|
|
mHourSpinner.setValue(getCurrentHour());// 根据更改更新日期控件
|
|
|
|
|
updateDateControl();// 获取调整后的新小时
|
|
|
|
|
int newHour = getCurrentHourOfDay();
|
|
|
|
|
|
|
|
|
|
// 检查新小时是否在一天的后半部分
|
|
|
|
|
if (newHour >= HOURS_IN_HALF_DAY) {
|
|
|
|
|
mIsAm = false;
|
|
|
|
|
updateAmPmControl();
|
|
|
|
|
mIsAm = false;// 将时间设置为下午
|
|
|
|
|
updateAmPmControl();// 更新上午/下午控件以反映更改
|
|
|
|
|
} else {
|
|
|
|
|
mIsAm = true;
|
|
|
|
|
updateAmPmControl();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
mDate.set(Calendar.MINUTE, newVal);
|
|
|
|
|
onDateTimeChanged();
|
|
|
|
|
mDate.set(Calendar.MINUTE, newVal);// 将日期中的分钟设置为新值
|
|
|
|
|
onDateTimeChanged();//通知时间和日期已更改
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -165,11 +169,11 @@ public class DateTimePicker extends FrameLayout {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
|
|
|
|
|
mIsAm = !mIsAm;
|
|
|
|
|
mIsAm = !mIsAm; // 切换上午和下午状态
|
|
|
|
|
if (mIsAm) {
|
|
|
|
|
mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY);
|
|
|
|
|
mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY);// 如果是上午,减去半天的小时数
|
|
|
|
|
} else {
|
|
|
|
|
mDate.add(Calendar.HOUR_OF_DAY, HOURS_IN_HALF_DAY);
|
|
|
|
|
mDate.add(Calendar.HOUR_OF_DAY, HOURS_IN_HALF_DAY);// 如果是下午,加上半天的小时数
|
|
|
|
|
}
|
|
|
|
|
updateAmPmControl();
|
|
|
|
|
onDateTimeChanged();
|
|
|
|
@ -249,12 +253,14 @@ public class DateTimePicker extends FrameLayout {
|
|
|
|
|
if (mIsEnabled == enabled) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 设置日期、分钟、小时、上午/下午控件是否可用
|
|
|
|
|
super.setEnabled(enabled);
|
|
|
|
|
mDateSpinner.setEnabled(enabled);
|
|
|
|
|
mMinuteSpinner.setEnabled(enabled);
|
|
|
|
|
mHourSpinner.setEnabled(enabled);
|
|
|
|
|
mAmPmSpinner.setEnabled(enabled);
|
|
|
|
|
mIsEnabled = enabled;
|
|
|
|
|
|
|
|
|
|
mIsEnabled = enabled;// 更新控件状态
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -322,12 +328,16 @@ public class DateTimePicker extends FrameLayout {
|
|
|
|
|
onDateTimeChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 获取当前月份
|
|
|
|
|
*/
|
|
|
|
|
public int getCurrentMonth() {
|
|
|
|
|
return mDate.get(Calendar.MONTH);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 设置当前月份
|
|
|
|
|
*/
|
|
|
|
|
public void setCurrentMonth(int month) {
|
|
|
|
|
if (!mInitialising && month == getCurrentMonth()) {
|
|
|
|
|
return;
|
|
|
|
@ -337,12 +347,16 @@ public class DateTimePicker extends FrameLayout {
|
|
|
|
|
onDateTimeChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 获取当前日期
|
|
|
|
|
*/
|
|
|
|
|
public int getCurrentDay() {
|
|
|
|
|
return mDate.get(Calendar.DAY_OF_MONTH);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 设置当前日期
|
|
|
|
|
*/
|
|
|
|
|
public void setCurrentDay(int dayOfMonth) {
|
|
|
|
|
if (!mInitialising && dayOfMonth == getCurrentDay()) {
|
|
|
|
|
return;
|
|
|
|
@ -352,54 +366,68 @@ public class DateTimePicker extends FrameLayout {
|
|
|
|
|
onDateTimeChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 获取当前小时
|
|
|
|
|
*/
|
|
|
|
|
public int getCurrentHourOfDay() {
|
|
|
|
|
return mDate.get(Calendar.HOUR_OF_DAY);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 获取当前小时
|
|
|
|
|
*/
|
|
|
|
|
private int getCurrentHour() {
|
|
|
|
|
if (mIs24HourView){
|
|
|
|
|
return getCurrentHourOfDay();
|
|
|
|
|
return getCurrentHourOfDay();// 如果是24小时制,直接返回当前小时
|
|
|
|
|
} else {
|
|
|
|
|
int hour = getCurrentHourOfDay();
|
|
|
|
|
if (hour > HOURS_IN_HALF_DAY) {
|
|
|
|
|
return hour - HOURS_IN_HALF_DAY;
|
|
|
|
|
return hour - HOURS_IN_HALF_DAY;// 如果当前小时大于半天的小时数,返回减去半天后的小时数
|
|
|
|
|
} else {
|
|
|
|
|
return hour == 0 ? HOURS_IN_HALF_DAY : hour;
|
|
|
|
|
return hour == 0 ? HOURS_IN_HALF_DAY : hour;// 如果当前小时为0,则返回半天的小时数,否则返回当前小时
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 设置当前小时
|
|
|
|
|
*/
|
|
|
|
|
//24小时制
|
|
|
|
|
public void setCurrentHour(int hourOfDay) {
|
|
|
|
|
// 如果不是初始化过程,并且要设置的小时等于当前小时,则不做任何操作
|
|
|
|
|
if (!mInitialising && hourOfDay == getCurrentHourOfDay()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
mDate.set(Calendar.HOUR_OF_DAY, hourOfDay);
|
|
|
|
|
mDate.set(Calendar.HOUR_OF_DAY, hourOfDay);// 将日期中的小时设置为新值
|
|
|
|
|
// 如果不是24小时制
|
|
|
|
|
if (!mIs24HourView) {
|
|
|
|
|
if (hourOfDay >= HOURS_IN_HALF_DAY) {
|
|
|
|
|
mIsAm = false;
|
|
|
|
|
mIsAm = false;// 设置为下午
|
|
|
|
|
if (hourOfDay > HOURS_IN_HALF_DAY) {
|
|
|
|
|
hourOfDay -= HOURS_IN_HALF_DAY;
|
|
|
|
|
hourOfDay -= HOURS_IN_HALF_DAY;// 如果大于半天的小时数,减去半天的小时数
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
mIsAm = true;
|
|
|
|
|
if (hourOfDay == 0) {
|
|
|
|
|
hourOfDay = HOURS_IN_HALF_DAY;
|
|
|
|
|
hourOfDay = HOURS_IN_HALF_DAY;// 如果小时为0,设置为半天的小时数
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
updateAmPmControl();
|
|
|
|
|
}
|
|
|
|
|
mHourSpinner.setValue(hourOfDay);
|
|
|
|
|
mHourSpinner.setValue(hourOfDay); // 设置小时控件的值为新值
|
|
|
|
|
onDateTimeChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 获取当前分钟
|
|
|
|
|
*/
|
|
|
|
|
public int getCurrentMinute() {
|
|
|
|
|
return mDate.get(Calendar.MINUTE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 设置当前分钟
|
|
|
|
|
*/
|
|
|
|
|
public void setCurrentMinute(int minute) {
|
|
|
|
|
if (!mInitialising && minute == getCurrentMinute()) {
|
|
|
|
|
return;
|
|
|
|
@ -417,29 +445,30 @@ public class DateTimePicker extends FrameLayout {
|
|
|
|
|
|
|
|
|
|
public void set24HourView(boolean is24HourView) {
|
|
|
|
|
if (mIs24HourView == is24HourView) {
|
|
|
|
|
return;
|
|
|
|
|
return; // 如果当前24小时制状态与要设置的状态相同,则不做任何操作
|
|
|
|
|
}
|
|
|
|
|
mIs24HourView = is24HourView;
|
|
|
|
|
mAmPmSpinner.setVisibility(is24HourView ? View.GONE : View.VISIBLE);
|
|
|
|
|
int hour = getCurrentHourOfDay();
|
|
|
|
|
updateHourControl();
|
|
|
|
|
setCurrentHour(hour);
|
|
|
|
|
updateAmPmControl();
|
|
|
|
|
mAmPmSpinner.setVisibility(is24HourView ? View.GONE : View.VISIBLE);// 根据24小时制状态设置上午/下午控件的可见性
|
|
|
|
|
int hour = getCurrentHourOfDay();// 获取当前小时
|
|
|
|
|
updateHourControl();// 更新小时控件
|
|
|
|
|
setCurrentHour(hour);// 设置当前小时
|
|
|
|
|
updateAmPmControl();// 更新上午/下午控件
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 对于星期几的算法
|
|
|
|
|
private void updateDateControl() {
|
|
|
|
|
Calendar cal = Calendar.getInstance();
|
|
|
|
|
cal.setTimeInMillis(mDate.getTimeInMillis());
|
|
|
|
|
cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1);
|
|
|
|
|
mDateSpinner.setDisplayedValues(null);
|
|
|
|
|
cal.setTimeInMillis(mDate.getTimeInMillis());// 获取当前时间
|
|
|
|
|
cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1);// 将时间向前推移半周减一天
|
|
|
|
|
mDateSpinner.setDisplayedValues(null);// 清空日期控件的显示值
|
|
|
|
|
// 遍历一周的日期
|
|
|
|
|
for (int i = 0; i < DAYS_IN_ALL_WEEK; ++i) {
|
|
|
|
|
cal.add(Calendar.DAY_OF_YEAR, 1);
|
|
|
|
|
mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE", cal);
|
|
|
|
|
mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE", cal);// 将日期格式化为"月.日 星期"的形式,并存入日期显示值数组
|
|
|
|
|
}
|
|
|
|
|
mDateSpinner.setDisplayedValues(mDateDisplayValues);
|
|
|
|
|
mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2);
|
|
|
|
|
mDateSpinner.invalidate();
|
|
|
|
|
mDateSpinner.setDisplayedValues(mDateDisplayValues); //设置日期控件的显示值为日期显示值数组
|
|
|
|
|
mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2);//设置日期控件的初始值为一周的中间位置
|
|
|
|
|
mDateSpinner.invalidate();// 使日期控件失效,以便刷新显示
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 对于AM\PM操作的算法
|
|
|
|
@ -454,10 +483,14 @@ public class DateTimePicker extends FrameLayout {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updateHourControl() {
|
|
|
|
|
//如果是24小时制
|
|
|
|
|
// 设置小时控件的最小值和最大值
|
|
|
|
|
if (mIs24HourView) {
|
|
|
|
|
mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW);
|
|
|
|
|
mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW);
|
|
|
|
|
} else {
|
|
|
|
|
// 如果是12小时制
|
|
|
|
|
// 设置小时控件的最小值和最大值
|
|
|
|
|
mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW);
|
|
|
|
|
mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW);
|
|
|
|
|
}
|
|
|
|
@ -468,11 +501,13 @@ public class DateTimePicker extends FrameLayout {
|
|
|
|
|
* @param callback 如果 null,则回调将不执行任何操作
|
|
|
|
|
*/
|
|
|
|
|
public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) {
|
|
|
|
|
mOnDateTimeChangedListener = callback;
|
|
|
|
|
mOnDateTimeChangedListener = callback;// 设置日期时间变化监听器的回调
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 当日期时间发生变化时触发回调
|
|
|
|
|
private void onDateTimeChanged() {
|
|
|
|
|
// 如果日期时间变化监听器不为空,则触发回调
|
|
|
|
|
if (mOnDateTimeChangedListener != null) {
|
|
|
|
|
// 通过回调通知当前年、月、日、小时、分钟的变化
|
|
|
|
|
mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(),
|
|
|
|
|
getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute());
|
|
|
|
|
}
|
|
|
|
|