Compare commits

...

10 Commits

@ -1,2 +0,0 @@
# test

Binary file not shown.

After

Width:  |  Height:  |  Size: 712 KiB

Binary file not shown.

@ -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() 方法根据时间格式的不同动态调整小时的选择范围,确保用户选择的时间是有效的。
Loading…
Cancel
Save