|
|
|
@ -0,0 +1,122 @@
|
|
|
|
|
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);
|
|
|
|
|
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();
|
|
|
|
|
}// 对于星期几的算法
|
|
|
|
|
|
|
|
|
|
private void updateAmPmControl() {
|
|
|
|
|
if (mIs24HourView) {
|
|
|
|
|
mAmPmSpinner.setVisibility(View.GONE);
|
|
|
|
|
} else {
|
|
|
|
|
int index = mIsAm ? Calendar.AM : Calendar.PM;
|
|
|
|
|
mAmPmSpinner.setValue(index);
|
|
|
|
|
mAmPmSpinner.setVisibility(View.VISIBLE);
|
|
|
|
|
}// 对于上下午操作的算法
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updateHourControl() {
|
|
|
|
|
if (mIs24HourView) {
|
|
|
|
|
mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW);
|
|
|
|
|
mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW);
|
|
|
|
|
} else {
|
|
|
|
|
mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW);
|
|
|
|
|
mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW);
|
|
|
|
|
}// 对与小时的算法
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
使用一个循环遍历一周的每一天。对于每一次迭代:
|
|
|
|
|
日历向前增加一天。
|
|
|
|
|
将格式化后的日期(格式为 "MM.dd EEEE",即月、日和完整的星期几名称)存储到 mDateDisplayValues 数组中。
|
|
|
|
|
设置并显示选择器的值:
|
|
|
|
|
mDateSpinner.setDisplayedValues(mDateDisplayValues);
|
|
|
|
|
mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2);
|
|
|
|
|
mDateSpinner.invalidate();
|
|
|
|
|
将新的日期值设置到选择器中。
|
|
|
|
|
将当前选择设置为中间的日期(即当前日期)。
|
|
|
|
|
调用 invalidate() 方法以刷新选择器的显示。
|
|
|
|
|
2. updateAmPmControl() 方法
|
|
|
|
|
这个方法根据时间格式(24 小时或 12 小时)管理 AM/PM 控件的可见性和当前值。
|
|
|
|
|
设置小时限制:
|
|
|
|
|
if (mIs24HourView) {
|
|
|
|
|
mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW);
|
|
|
|
|
mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW);
|
|
|
|
|
} else {
|
|
|
|
|
mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW);
|
|
|
|
|
mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW);
|
|
|
|
|
}
|
|
|
|
|
如果是 24 小时模式,则将小时选择器的最小值和最大值设置为对应的常量(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW 和 HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW)。
|
|
|
|
|
如果是 12 小时模式,则将最小值和最大值设置为对应的常量(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW 和 HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW)。
|
|
|
|
|
总结
|
|
|
|
|
updateDateControl() 方法负责准备一周的日期,居中显示在选择器中,并格式化为用户友好的形式。
|
|
|
|
|
updateAmPmControl() 方法管理 AM/PM 选择器的可见性和当前值,依据时间格式的不同进行相应的处理。
|
|
|
|
|
updateHourControl() 方法根据用户选择的时间格式设置小时选择器的范围。
|
|
|
|
|
这些方法共同提供了一个用户友好的界面,允许用户方便地选择日期和时间,适应不同的时间表示方式。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Calendar cal = Calendar.getInstance();
|
|
|
|
|
创建日历实例:这里使用 Calendar.getInstance() 创建一个日历对象 cal,它包含当前日期和时间。
|
|
|
|
|
cal.setTimeInMillis(mDate.getTimeInMillis());
|
|
|
|
|
设置日历时间:mDate 是一个 Calendar 类型的对象,这行代码将 cal 的时间设置为 mDate 的值。这使得 cal 从当前日期变为用户选择的日期。
|
|
|
|
|
cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1);
|
|
|
|
|
调整日期以居中显示:
|
|
|
|
|
DAYS_IN_ALL_WEEK 应该是一个常量,代表一周的天数(通常是7)。
|
|
|
|
|
这行代码从 cal 中的当前时间减去一周的一半天数(例如,7/2=3.5,向下取整后是3),再减去1,使得当前日期居中于即将显示的日期范围内。比如,如果今天是周四,它会向回调整到上周一。
|
|
|
|
|
mDateSpinner.setDisplayedValues(null);
|
|
|
|
|
清空选择器的当前值:在填充新的日期值之前,首先清空 mDateSpinner 中已有的显示值,确保显示的是更新后的日期。
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
填充日期显示值:
|
|
|
|
|
这个循环运行 7 次(从 0 到 6),为每一天设置显示值。
|
|
|
|
|
cal.add(Calendar.DAY_OF_YEAR, 1); 将当前日历日期增加一天。
|
|
|
|
|
DateFormat.format("MM.dd EEEE", cal) 将日期格式化为 "MM.dd 星期几" 的形式,如 "11.19 星期一"。
|
|
|
|
|
将格式化后的结果赋值给 mDateDisplayValues 数组的相应索引。
|
|
|
|
|
mDateSpinner.setDisplayedValues(mDateDisplayValues);
|
|
|
|
|
设置选择器显示新值:将刚才填充的七个日期值设置到 mDateSpinner 中,以便用户可以从中选择。
|
|
|
|
|
mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2);
|
|
|
|
|
设置当前选择的值:将选择器的当前值设置为数组的中间值,即显示区域的中心日期。例如,若原本是 7 天,且当前日期在中间,则设置为 3(表示第四天)。
|
|
|
|
|
java
|
|
|
|
|
mDateSpinner.invalidate();
|
|
|
|
|
刷新选择器:调用 invalidate() 方法以确保 UI 更新并重新绘制选择器,保证用户看到最新的日期选择。
|
|
|
|
|
2. updateAmPmControl() 方法
|
|
|
|
|
这个方法负责更新 AM/PM 控件的显示,主要是根据用户选择的时间格式来调整可见性。
|
|
|
|
|
if (mIs24HourView) {
|
|
|
|
|
mAmPmSpinner.setVisibility(View.GONE);
|
|
|
|
|
} else {
|
|
|
|
|
判断时间格式:
|
|
|
|
|
mIs24HourView 是一个布尔值,如果为 true,则表示使用 24 小时格式。在这种情况下,AM/PM 选择器不需要显示,所以调用 setVisibility(View.GONE) 隐藏选择器。
|
|
|
|
|
int index = mIsAm ? Calendar.AM : Calendar.PM;
|
|
|
|
|
设置 AM/PM 的索引:
|
|
|
|
|
mIsAm 是一个布尔值,表示当前是否为上午。
|
|
|
|
|
这里根据 mIsAm 来设置 index:如果 mIsAm 为 true,则 index 被设置为 Calendar.AM,否则设置为 Calendar.PM。
|
|
|
|
|
mAmPmSpinner.setValue(index);
|
|
|
|
|
设置 AM/PM 选择器的当前值:为 AM/PM 选择器设置刚刚计算的索引值,确保用户选择了正确的 AM 或 PM。
|
|
|
|
|
mAmPmSpinner.setVisibility(View.VISIBLE);
|
|
|
|
|
显示 AM/PM 选择器:如果不是 24 小时格式,显示 AM/PM 选择器(设置可见性为可见)。
|
|
|
|
|
3. updateHourControl() 方法
|
|
|
|
|
这个方法负责根据时间格式更新小时控制的上下限。
|
|
|
|
|
if (mIs24HourView) {
|
|
|
|
|
mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW);
|
|
|
|
|
mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW);
|
|
|
|
|
} else {
|
|
|
|
|
判断时间格式:
|
|
|
|
|
如果 mIs24HourView 为 true,则设置小时选择器的最小值和最大值为对应的 24 小时值。比如,可能最小值为 0(午夜),最大值为 23(晚上 11 点)。
|
|
|
|
|
mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW);
|
|
|
|
|
mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW);
|
|
|
|
|
设置 12 小时格式的小时限制:如果不是 24 小时格式,设置小时选择器的最小值和最大值为对应的 12 小时值。这通常是 1 到 12(例如,1 AM 到 12 PM)。
|
|
|
|
|
总结
|
|
|
|
|
updateDateControl() 方法负责为用户提供一周的日期选择,并将当前日期居中显示在选择器中。通过循环构建日期字符串并设置到 UI 中,保证了界面的友好性和可操作性。
|
|
|
|
|
updateAmPmControl() 方法确保 AM/PM 选择器根据用户的时间格式进行适当的显示与隐藏,提供了良好的用户体验。
|
|
|
|
|
updateHourControl() 方法根据时间格式的不同动态调整小时的选择范围,确保用户选择的时间是有效的。
|