diff --git a/src/周希奥UI注释4 b/src/周希奥UI注释4 new file mode 100644 index 0000000..ce2db4e --- /dev/null +++ b/src/周希奥UI注释4 @@ -0,0 +1,554 @@ +package net.micode.notes.ui; + +// 导入Java系统中处理日期格式符号的类 +import java.text.DateFormatSymbols; +// 导入Java系统中处理日期和时间的类 +import java.util.Calendar; + +// 导入应用程序中的资源类 +import net.micode.notes.R; + +// 导入Android系统中处理上下文环境的类,用于访问应用程序的资源和类 +import android.content.Context; +// 导入Android系统中处理日期格式的类 +import android.text.format.DateFormat; +// 导入Android系统中处理视图的类 +import android.view.View; +// 导入Android系统中处理布局的类 +import android.widget.FrameLayout; +// 导入Android系统中处理数字选择器的类 +import android.widget.NumberPicker; + +// DateTimePicker类继承自FrameLayout,用于创建一个日期和时间选择器 +public class DateTimePicker extends FrameLayout { + // FrameLayout是一种布局模板,所有子元素默认在屏幕的右上方 + private static final boolean DEFAULT_ENABLE_STATE = true; // 默认启用状态 + + // 定义常量 + 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; // 一周的天数 + private static final int DATE_SPINNER_MIN_VAL = 0; // 日期选择器的最小值 + private static final int DATE_SPINNER_MAX_VAL = DAYS_IN_ALL_WEEK - 1; // 日期选择器的最大值 + private static final int HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW = 0; // 24小时制时小时选择器的最小值 + private static final int HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW = 23; // 24小时制时小时选择器的最大值 + private static final int HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW = 1; // 12小时制时小时选择器的最小值 + private static final int HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW = 12; // 12小时制时小时选择器的最大值 + private static final int MINUT_SPINNER_MIN_VAL = 0; // 分钟选择器的最小值 + private static final int MINUT_SPINNER_MAX_VAL = 59; // 分钟选择器的最大值 + private static final int AMPM_SPINNER_MIN_VAL = 0; // AM/PM选择器的最小值 + private static final int AMPM_SPINNER_MAX_VAL = 1; // AM/PM选择器的最大值 + + // 初始化控件 + private final NumberPicker mDateSpinner; // 日期选择器 + private final NumberPicker mHourSpinner; // 小时选择器 + private final NumberPicker mMinuteSpinner; // 分钟选择器 + private final NumberPicker mAmPmSpinner; // AM/PM选择器 + // NumberPicker是数字选择器,用于用户选择日期、时间等 + + private Calendar mDate; // 定义了Calendar类型的变量mDate,用于操作时间 + private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK]; // 用于存储日期显示值的数组 + + private boolean mIsAm; // 标记当前是否为上午(AM) + + private boolean mIs24HourView; // 标记是否为24小时制视图 + + private boolean mIsEnabled = DEFAULT_ENABLE_STATE; // 标记DateTimePicker是否启用 + + private boolean mInitialising; // 标记DateTimePicker是否正在初始化 + + private OnDateTimeChangedListener mOnDateTimeChangedListener; // 时间变化监听器 + + +// 定义一个监听器,用于监听日期选择器的值变化 + 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); + // 更新日期选择器的显示,使其与当前日期同步 + updateDateControl(); + // 通知其他监听器日期时间已更改,以便进行相应的处理 + onDateTimeChanged(); + } + };// OnValueChangeListener,这是时间改变监听器,这里主要是对日期的监听 + // 将现在日期的值传递给mDate;updateDateControl是同步操作 + + // 定义一个监听器,用于监听小时选择器的值变化 + private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() { + // 这里是对小时(Hour)的监听 + @Override + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + boolean isDateChanged = false; // 标记日期是否发生变化 + Calendar cal = Calendar.getInstance(); // 创建一个Calendar实例用于操作日期 + if (!mIs24HourView) { + // 如果是12小时制 + if (!mIsAm && oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) { + // 如果从晚上11点变为12点,日期加1天 + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, 1); + isDateChanged = true; + } else if (mIsAm && oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { + // 如果从凌晨12点变为11点,日期减1天 + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, -1); + isDateChanged = true; + } + if (oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY || + oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { + // 如果小时从11变为12或从12变为11,切换AM/PM + mIsAm = !mIsAm; + // 更新AM/PM选择器的显示,使其与当前AM/PM状态同步 + updateAmPmControl(); + } + } else { + // 如果是24小时制 + if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) { + // 如果从晚上11点变为0点,日期加1天 + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, 1); + isDateChanged = true; + } else if (oldVal == 0 && newVal == HOURS_IN_ALL_DAY - 1) { + // 如果从0点变为晚上11点,日期减1天 + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, -1); + isDateChanged = true; + } + } + // 根据当前的AM/PM状态计算新的小时值 + int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY); + // 更新日期中的小时值 + mDate.set(Calendar.HOUR_OF_DAY, newHour); + // 通知其他监听器日期时间已更改,以便进行相应的处理 + onDateTimeChanged(); + if (isDateChanged) { + // 如果日期发生变化 + setCurrentYear(cal.get(Calendar.YEAR)); //更新年 + setCurrentMonth(cal.get(Calendar.MONTH)); //更新月 + setCurrentDay(cal.get(Calendar.DAY_OF_MONTH)); //更新年日 + } + } + }; + + // 定义一个监听器,用于监听分钟选择器的值变化 + private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() { + @Override + // 这里是对分钟(Minute)改变的监听 + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + int minValue = mMinuteSpinner.getMinValue(); // 获取分钟选择器的最小值 + int maxValue = mMinuteSpinner.getMaxValue(); // 获取分钟选择器的最大值 + int offset = 0; // 设置offset,作为小时改变的一个记录数据 + + // 判断分钟的变化是否会导致小时的变化 + if (oldVal == maxValue && newVal == minValue) { + offset += 1; // 如果原值为59,新值为0,则offset加1,表示小时需要增加1 + } else if (oldVal == minValue && newVal == maxValue) { + offset -= 1; // 如果原值为0,新值为59,则offset减1,表示小时需要减少1 + } + + // 如果offset不为0,表示分钟的变化导致了小时的变化 + if (offset != 0) { + mDate.add(Calendar.HOUR_OF_DAY, offset); // 更新日期中的小时值 + mHourSpinner.setValue(getCurrentHour()); // 更新小时选择器的显示 + updateDateControl(); // 更新日期选择器的显示 + int newHour = getCurrentHourOfDay(); // 获取更新后的小时值 + if (newHour >= HOURS_IN_HALF_DAY) { + mIsAm = false; // 如果小时大于等于12,则设置为PM + updateAmPmControl(); // 更新AM/PM选择器的显示 + } else { + mIsAm = true; // 如果小时小于12,则设置为AM + updateAmPmControl(); // 更新AM/PM选择器的显示 + } + } + + mDate.set(Calendar.MINUTE, newVal); // 更新日期中的分钟值 + onDateTimeChanged(); // 通知其他监听器日期时间已更改 + } + }; + + // 定义一个监听器,用于监听AM/PM选择器的值变化 + private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() { + // 对AM和PM的监听 + @Override + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + mIsAm = !mIsAm; // 切换AM/PM状态 + if (mIsAm) { + // 如果切换到AM,将小时数减去12小时 + mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY); + } else { + // 如果切换到PM,将小时数加上12小时 + mDate.add(Calendar.HOUR_OF_DAY, HOURS_IN_HALF_DAY); + } + updateAmPmControl(); // 更新AM/PM选择器的显示 + onDateTimeChanged(); // 通知其他监听器日期时间已更改 + } + }; + + // 定义一个接口,用于处理日期时间变化的事件 + public interface OnDateTimeChangedListener { + void onDateTimeChanged(DateTimePicker view, int year, int month, + int dayOfMonth, int hourOfDay, int minute); + } + + // 构造函数,用于创建DateTimePicker实例 + public DateTimePicker(Context context) { + this(context, System.currentTimeMillis()); // 使用当前系统时间作为初始时间 + }// 通过对数据库的访问,获取当前的系统时间 + + // 构造函数,用于创建DateTimePicker实例,并指定初始时间 + public DateTimePicker(Context context, long date) { + this(context, date, DateFormat.is24HourFormat(context)); // 根据系统设置确定是否使用24小时制 + }// 上面函数的得到的是一个天文数字(1970至今的秒数),需要DateFormat将其变得有意义 + + public DateTimePicker(Context context, long date, boolean is24HourView) { + super(context); // 调用父类的构造函数,初始化FrameLayout + // 获取系统时间 + mDate = Calendar.getInstance(); // 创建一个Calendar实例,表示当前系统时间 + mInitialising = true; // 标记DateTimePicker正在初始化 + mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY; // 根据当前小时判断是否为上午(AM) + + // 加载日期时间选择器的布局 + inflate(context, R.layout.datetime_picker, this); + // 如果当前Activity里用到别的layout,比如对话框layout + // 还要设置这个layout上的其他组件的内容,就必须用inflate()方法先将对话框的layout找出来 + // 然后再用findViewById()找到它上面的其它组件 + + // 初始化日期选择器 + mDateSpinner = (NumberPicker) findViewById(R.id.date); + mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL); // 设置日期选择器的最小值 + mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL); // 设置日期选择器的最大值 + mDateSpinner.setOnValueChangedListener(mOnDateChangedListener); // 设置日期选择器的值变化监听器 + + // 初始化小时选择器 + mHourSpinner = (NumberPicker) findViewById(R.id.hour); + mHourSpinner.setOnValueChangedListener(mOnHourChangedListener); // 设置小时选择器的值变化监听器 + + // 初始化分钟选择器 + mMinuteSpinner = (NumberPicker) findViewById(R.id.minute); + mMinuteSpinner.setMinValue(MINUT_SPINNER_MIN_VAL); // 设置分钟选择器的最小值 + mMinuteSpinner.setMaxValue(MINUT_SPINNER_MAX_VAL); // 设置分钟选择器的最大值 + mMinuteSpinner.setOnLongPressUpdateInterval(100); // 设置长按更新间隔 + mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener); // 设置分钟选择器的值变化监听器 + + // 初始化AM/PM选择器 + String[] stringsForAmPm = new DateFormatSymbols().getAmPmStrings(); // 获取AM/PM字符串 + mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm); + mAmPmSpinner.setMinValue(AMPM_SPINNER_MIN_VAL); // 设置AM/PM选择器的最小值 + mAmPmSpinner.setMaxValue(AMPM_SPINNER_MAX_VAL); // 设置AM/PM选择器的最大值 + mAmPmSpinner.setDisplayedValues(stringsForAmPm); // 设置AM/PM选择器的显示值 + mAmPmSpinner.setOnValueChangedListener(mOnAmPmChangedListener); // 设置AM/PM选择器的值变化监听器 + + // 更新控件到初始状态 + updateDateControl(); // 更新日期选择器的显示 + updateHourControl(); // 更新小时选择器的显示 + updateAmPmControl(); // 更新AM/PM选择器的显示 + + set24HourView(is24HourView); // 设置是否为24小时制视图 + + // 设置当前时间 + setCurrentDate(date); // 设置DateTimePicker的当前时间 + + setEnabled(isEnabled()); // 设置DateTimePicker的启用状态 + + // 设置内容描述 + mInitialising = false; // 标记DateTimePicker初始化完成 + } + + @Override + public void setEnabled(boolean enabled) { + if (mIsEnabled == enabled) { + return; // 如果当前启用状态与传入的启用状态相同,则无需更新 + } + super.setEnabled(enabled); // 调用父类的setEnabled方法,更新FrameLayout的启用状态 + mDateSpinner.setEnabled(enabled); // 更新日期选择器的启用状态 + mMinuteSpinner.setEnabled(enabled); // 更新分钟选择器的启用状态 + mHourSpinner.setEnabled(enabled); // 更新小时选择器的启用状态 + mAmPmSpinner.setEnabled(enabled); // 更新AM/PM选择器的启用状态 + mIsEnabled = enabled; // 更新DateTimePicker的启用状态标记 + } + //存在疑问!!!!!!!!!!!!!setEnabled的作用 + //下面的代码通过原程序的注释已经比较清晰,另外可以通过函数名来判断 + //下面的各函数主要是对上面代码引用到的各函数功能的实现 + + @Override + public boolean isEnabled() { + return mIsEnabled; + } // 返回DateTimePicker当前的启用状态。如果DateTimePicker被启用,则返回true;如果被禁用,则返回false。 + + /** + * 获取当前日期时间的毫秒数 + * + * @return 当前日期时间的毫秒数 + */ + public long getCurrentDateInTimeMillis() { + return mDate.getTimeInMillis(); + } // 实现函数——得到当前的日期时间的毫秒数 + + /** + * 设置当前的日期时间 + * + * @param date 当前日期时间的毫秒数 + */ + public void setCurrentDate(long date) { + Calendar cal = Calendar.getInstance(); // 创建一个Calendar实例 + cal.setTimeInMillis(date); // 使用传入的毫秒数设置Calendar实例的时间 + setCurrentDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), + cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)); + } // 实现函数功能——设置当前的时间,参数是date的毫秒数 + + /** + * 设置当前的日期时间 + * + * @param year 当前的年份 + * @param month 当前的月份 + * @param dayOfMonth 当前的日期 + * @param hourOfDay 当前的小时 + * @param minute 当前的分钟 + */ + public void setCurrentDate(int year, int month, + int dayOfMonth, int hourOfDay, int minute) { + setCurrentYear(year); // 设置当前的年份 + setCurrentMonth(month); // 设置当前的月份 + setCurrentDay(dayOfMonth); // 设置当前的日期 + setCurrentHour(hourOfDay); // 设置当前的小时 + setCurrentMinute(minute); // 设置当前的分钟 + } // 实现函数功能——设置当前的时间,参数是各详细的变量 + + /** + * 获取当前的年份 + * + * @return 当前的年份 + */ + public int getCurrentYear() { + return mDate.get(Calendar.YEAR); + } // 获取当前的年份 + + /** + * 设置当前的年份 + * + * @param year 当前的年份 + */ + public void setCurrentYear(int year) { + if (!mInitialising && year == getCurrentYear()) { + return; // 如果当前年份与传入年份相同,则无需更新 + } + mDate.set(Calendar.YEAR, year); // 使用传入的年份值更新Calendar实例中的年份 + updateDateControl(); // 更新日期选择器的显示 + onDateTimeChanged(); // 通知日期时间已更改 + } // 设置当前的年份,并更新日期选择器的显示和通知日期时间已更改 + + /** + * 获取当前的月份 + * + * @return 当前的月份 + */ + public int getCurrentMonth() { + return mDate.get(Calendar.MONTH); + } // 获取当前的月份 + + /** + * 设置当前的月份 + * + * @param month 当前的月份 + */ + public void setCurrentMonth(int month) { + if (!mInitialising && month == getCurrentMonth()) { + return; // 如果当前月份与传入月份相同,则无需更新 + } + mDate.set(Calendar.MONTH, month); // 使用传入的月份值更新Calendar实例中的月份 + updateDateControl(); // 更新日期选择器的显示 + onDateTimeChanged(); // 通知日期时间已更改 + } // 设置当前的月份,并更新日期选择器的显示和通知日期时间已更改 + + /** + * 获取当前的日期 + * + * @return 当前的日期 + */ + public int getCurrentDay() { + return mDate.get(Calendar.DAY_OF_MONTH); + } // 获取当前的日期 + + /** + * 设置当前的日期 + * + * @param dayOfMonth 当前的日期 + */ + public void setCurrentDay(int dayOfMonth) { + if (!mInitialising && dayOfMonth == getCurrentDay()) { + return; // 如果当前日期与传入日期相同,则无需更新 + } + mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); // 使用传入的日期值更新Calendar实例中的日期 + updateDateControl(); // 更新日期选择器的显示 + onDateTimeChanged(); // 通知日期时间已更改 + } // 设置当前的日期,并更新日期选择器的显示和通知日期时间已更改 + + /** + * 获取当前的小时(24小时制) + * + * @return 当前的小时(24小时制) + */ + public int getCurrentHourOfDay() { + return mDate.get(Calendar.HOUR_OF_DAY); + } // 获取当前的小时(24小时制) + + // 获取当前的小时,根据是否为24小时制进行转换 + private int getCurrentHour() { + if (mIs24HourView) { + // 如果是24小时制,直接返回当前的小时(0~23) + return getCurrentHourOfDay(); + } else { + // 如果是12小时制,进行转换 + int hour = getCurrentHourOfDay(); + if (hour > HOURS_IN_HALF_DAY) { + // 如果小时大于12,则减去12 + return hour - HOURS_IN_HALF_DAY; + } else { + // 如果小时为0,则返回12,否则返回小时本身 + return hour == 0 ? HOURS_IN_HALF_DAY : hour; + } + } + } + + /** + * 设置当前的小时(24小时制),范围为0~23 + * + * @param hourOfDay 当前的小时(24小时制) + */ + public void setCurrentHour(int hourOfDay) { + if (!mInitialising && hourOfDay == getCurrentHourOfDay()) { + return; // 如果当前小时与传入小时相同,则无需更新 + } + mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); // 更新Calendar实例中的小时 + if (!mIs24HourView) { + // 如果是12小时制,进行转换 + if (hourOfDay >= HOURS_IN_HALF_DAY) { + mIsAm = false; // 设置为PM + if (hourOfDay > HOURS_IN_HALF_DAY) { + hourOfDay -= HOURS_IN_HALF_DAY; // 减去12 + } + } else { + mIsAm = true; // 设置为AM + if (hourOfDay == 0) { + hourOfDay = HOURS_IN_HALF_DAY; // 将0转换为12 + } + } + updateAmPmControl(); // 更新AM/PM选择器的显示 + } + mHourSpinner.setValue(hourOfDay); // 更新小时选择器的值 + onDateTimeChanged(); // 通知日期时间已更改 + } + + /** + * 获取当前的分钟 + * + * @return 当前的分钟 + */ + public int getCurrentMinute() { + return mDate.get(Calendar.MINUTE); // 返回当前的分钟 + } + + /** + * 设置当前的分钟 + * + * @param minute 当前的分钟 + */ + public void setCurrentMinute(int minute) { + if (!mInitialising && minute == getCurrentMinute()) { + return; // 如果当前分钟与传入分钟相同,则无需更新 + } + mMinuteSpinner.setValue(minute); // 更新分钟选择器的值 + mDate.set(Calendar.MINUTE, minute); // 更新Calendar实例中的分钟 + onDateTimeChanged(); // 通知日期时间已更改 + } + + /** + * 返回是否为24小时制视图 + * + * @return 如果是24小时制视图,则返回true;否则返回false + */ + public boolean is24HourView() { + return mIs24HourView; // 返回是否为24小时制视图 + } + + /** + * 设置是否为24小时制或AM/PM模式 + * + * @param is24HourView 如果为true,则设置为24小时制;否则设置为AM/PM模式 + */ + public void set24HourView(boolean is24HourView) { + if (mIs24HourView == is24HourView) { + return; // 如果当前模式与传入模式相同,则无需更新 + } + mIs24HourView = is24HourView; // 更新24小时制视图标记 + mAmPmSpinner.setVisibility(is24HourView ? View.GONE : View.VISIBLE); // 根据模式设置AM/PM选择器的可见性 + int hour = getCurrentHourOfDay(); // 获取当前的小时(24小时制) + updateHourControl(); // 更新小时选择器的显示 + setCurrentHour(hour); // 更新当前的小时 + updateAmPmControl(); // 更新AM/PM选择器的显示 + } + + // 更新日期选择器的显示 + private void updateDateControl() { + Calendar cal = Calendar.getInstance(); // 创建一个Calendar实例 + cal.setTimeInMillis(mDate.getTimeInMillis()); // 设置Calendar实例的时间 + 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); // 格式化日期并存储到显示值数组中 + } + mDateSpinner.setDisplayedValues(mDateDisplayValues); // 设置日期选择器的显示值 + mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2); // 设置日期选择器的初始值 + mDateSpinner.invalidate(); // 使日期选择器重新绘制 + } + + // 更新AM/PM选择器的显示 + private void updateAmPmControl() { + if (mIs24HourView) { + // 如果是24小时制,隐藏AM/PM选择器,因为24小时制不需要AM/PM的概念 + mAmPmSpinner.setVisibility(View.GONE); + } else { + // 如果是AM/PM模式,显示AM/PM选择器,并根据当前的AM/PM状态设置其值 + // mIsAm表示当前是否为上午(AM),如果为true,则设置为Calendar.AM;否则设置为Calendar.PM + int index = mIsAm ? Calendar.AM : Calendar.PM; + mAmPmSpinner.setValue(index); // 更新AM/PM选择器的值 + mAmPmSpinner.setVisibility(View.VISIBLE); // 显示AM/PM选择器 + } + } + + // 更新小时选择器的显示 + private void updateHourControl() { + if (mIs24HourView) { + // 如果是24小时制,设置小时选择器的最小值为0,最大值为23 + mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW); + mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW); + } else { + // 如果是12小时制,设置小时选择器的最小值为1,最大值为12 + mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW); + mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW); + } + // 这个方法根据当前的小时制(24小时制或12小时制)来调整小时选择器的范围 + } + + /** + * 设置日期时间变化的回调 + * + * @param callback 日期时间变化的回调接口,如果为null则不执行任何操作 + */ + public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) { + mOnDateTimeChangedListener = callback; + // 该方法用于设置日期时间变化的回调接口,当日期时间发生变化时,会调用该接口的方法 + } + + // 当日期时间发生变化时调用的方法 + private void onDateTimeChanged() { + if (mOnDateTimeChangedListener != null) { + // 如果设置了日期时间变化的回调接口,则调用其onDateTimeChanged方法 + mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(), + getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute()); + // 传递当前的日期时间信息给回调接口 + } + } +} \ No newline at end of file