You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2Q1/ui/DateTimePickerDialog.java

143 lines
13 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* Copyright (c) 2010 - 2011, The MiCode Open Source Community (www.micode.net)
* 版权声明表明该代码受Apache License 2.0协议的许可,并且说明了版权归属以及相关的许可范围等信息。
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// 声明该类所属的包名表明这个类位于net.micode.notes.ui包下在项目的包结构中有其特定的组织和访问层级关系。
package net.micode.notes.ui;
// 导入必要的类库这里导入了Calendar类用于处理日期和时间相关的操作比如获取、设置具体的年、月、日、时、分等信息。
import java.util.Calendar;
// 导入R类这个类通常是由Android的资源编译系统自动生成的用于访问项目中的各种资源如布局文件、字符串资源、图片资源等这里主要用于获取相关的字符串资源等。
import net.micode.notes.R;
// 导入DateTimePicker类应该是自定义的用于选择日期和时间的控件类提供了日期时间选择的相关功能和界面交互逻辑。
import net.micode.notes.ui.DateTimePicker;
// 导入DateTimePicker类中定义的OnDateTimeChangedListener接口用于监听日期时间选择器中的日期时间发生变化的事件以便进行相应的处理操作。
import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener;
// 导入相关的Android系统类AlertDialog用于创建弹出式的对话框提供一种提示、确认等交互的UI形式
// Context用于获取应用的上下文环境信息是很多Android操作的基础
// DialogInterface用于处理对话框相关的交互逻辑比如按钮点击等事件
// OnClickListener用于监听点击事件在这里用于监听对话框按钮的点击操作并执行相应逻辑。
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
// 导入用于处理日期时间格式化相关操作的类和方法比如判断是否是24小时制格式、按照指定格式格式化日期时间等功能。
import android.text.format.DateFormat;
import android.text.format.DateUtils;
// DateTimePickerDialog类继承自AlertDialog类意味着它是一个特殊的对话框用于展示日期时间选择的界面并实现了OnClickListener接口
// 用于处理对话框中按钮的点击事件,整体实现了一个可以让用户选择日期时间并在确定后进行相应回调处理的对话框功能。
public class DateTimePickerDialog extends AlertDialog implements OnClickListener {
// 定义一个Calendar类型的成员变量mDate用于存储当前日期时间选择器所表示的日期时间信息通过Calendar.getInstance()获取初始值,即当前系统时间对应的日期时间对象。
private Calendar mDate = Calendar.getInstance();
// 定义一个布尔类型的成员变量mIs24HourView用于标记当前日期时间选择器是否采用24小时制视图模式初始值会根据系统设置等情况后续进行设置。
private boolean mIs24HourView;
// 定义一个OnDateTimeSetListener类型的成员变量mOnDateTimeSetListener这是一个自定义的接口类型变量
// 外部类可以实现这个接口并传入该对话框,用于在用户点击对话框中的确定按钮并设置好日期时间后,接收相应的回调通知并执行自定义的业务逻辑。
private OnDateTimeSetListener mOnDateTimeSetListener;
// 定义一个DateTimePicker类型的成员变量mDateTimePicker这是前面导入的自定义日期时间选择器控件的实例用于在对话框中展示给用户进行日期时间的选择操作。
private DateTimePicker mDateTimePicker;
// 定义一个内部接口OnDateTimeSetListener外部类需要实现这个接口来监听用户在对话框中完成日期时间选择并点击确定按钮后的事件
// 接口中定义了OnDateTimeSet方法该方法会在相应事件触发时被调用传入当前的对话框实例以及用户选择的日期时间以毫秒为单位的时间戳表示作为参数方便外部类进行后续处理。
public interface OnDateTimeSetListener {
void OnDateTimeSet(AlertDialog dialog, long date);
}
// 这是DateTimePickerDialog类的构造函数用于创建该对话框的实例接收一个Context类型的参数context用于获取应用的上下文环境信息
// 以及一个long类型的参数date用于指定初始的日期时间以毫秒为单位的时间戳形式表示对话框打开时日期时间选择器默认显示的日期时间。
public DateTimePickerDialog(Context context, long date) {
// 调用父类AlertDialog的构造函数传入上下文环境context完成父类的初始化操作确保这个自定义对话框能继承AlertDialog的相关属性和功能正常展示为一个对话框的形式。
super(context);
// 创建一个DateTimePicker的实例传入上下文环境context用于生成日期时间选择器控件这个控件将被添加到对话框中供用户进行日期时间的选择操作。
mDateTimePicker = new DateTimePicker(context);
// 将创建好的日期时间选择器控件mDateTimePicker设置为对话框的视图内容这样当对话框显示时用户就能看到并操作这个日期时间选择器了。
setView(mDateTimePicker);
// 为日期时间选择器mDateTimePicker设置日期时间变化监听器当用户在日期时间选择器上选择不同的日期、时间等操作导致日期时间发生变化时
// 会触发监听器中的onDateTimeChanged方法在这个方法内部会将选择器上的新日期时间信息更新到mDate对象中即存储对话框当前表示的日期时间的对象
// 并调用updateTitle方法根据新的日期时间更新对话框的标题显示内容使其始终能准确反映当前选择的日期时间情况。
mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() {
public void onDateTimeChanged(DateTimePicker view, int year, int month,
int dayOfMonth, int hourOfDay, int minute) {
mDate.set(Calendar.YEAR, year);
mDate.set(Calendar.MONTH, month);
mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
mDate.set(Calendar.HOUR_OF_DAY, hourOfDay);
mDate.set(Calendar.MINUTE, minute);
updateTitle(mDate.getTimeInMillis());
}
});
// 将传入的初始日期时间以毫秒为单位的时间戳date设置到mDate对象中通过setTimeInMillis方法以此来初始化对话框中日期时间选择器默认显示的日期时间信息。
mDate.setTimeInMillis(date);
// 将mDate对象中表示秒的部分设置为0确保日期时间的精确性以及符合一般的日期时间使用场景通常在选择日期时间时不需要关注秒的设置这里统一初始化为0秒。
mDate.set(Calendar.SECOND, 0);
// 调用日期时间选择器mDateTimePicker的setCurrentDate方法传入mDate对象的时间戳通过getTimeInMillis方法获取
// 用于将日期时间选择器的显示状态更新为与mDate对象所表示的日期时间一致保证界面显示和内部存储的初始日期时间是匹配的。
mDateTimePicker.setCurrentDate(mDate.getTimeInMillis());
// 设置对话框的确定按钮通过调用setButton方法传入从资源文件中获取的表示确定按钮文本的字符串通过context.getString方法获取R.string.datetime_dialog_ok对应的字符串资源
// 以及当前类this作为点击事件的监听器因为当前类实现了OnClickListener接口会处理确定按钮的点击事件使得用户点击确定按钮时能触发相应的逻辑。
setButton(context.getString(R.string.datetime_dialog_ok), this);
// 设置对话框的取消按钮通过调用setButton2方法传入从资源文件中获取的表示取消按钮文本的字符串通过context.getString方法获取R.string.datetime_dialog_cancel对应的字符串资源
// 以及传入null作为点击事件的监听器表示取消按钮点击后不做额外的处理一般就是关闭对话框等默认操作
setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null);
// 调用set24HourView方法传入通过DateFormat.is24HourFormat方法获取的布尔值该方法用于判断当前系统是否采用24小时制格式
// 将获取到的布尔值传入set24HourView方法用于设置日期时间选择器是否为24小时制视图模式以此来保证日期时间选择器的显示模式与系统设置相符。
set24HourView(DateFormat.is24HourFormat(this.getContext()));
// 调用updateTitle方法传入mDate对象的时间戳通过getTimeInMillis方法获取用于初始化对话框的标题显示内容使其能根据初始的日期时间正确展示相关信息给用户。
updateTitle(mDate.getTimeInMillis());
}
// 用于设置日期时间选择器是否为24小时制视图模式的方法接收一个布尔类型的参数is24HourView将其值赋给成员变量mIs24HourView
// 以此来更新日期时间选择器的显示模式后续可以根据这个变量的值来调整日期时间选择器中相关控件如小时选择器、AM/PM选择器等的显示和操作逻辑。
public void set24HourView(boolean is24HourView) {
mIs24HourView = is24HourView;
}
// 用于设置日期时间设置监听器的方法接收一个OnDateTimeSetListener类型的参数callBack将其赋值给成员变量mOnDateTimeSetListener
// 外部类可以通过实现OnDateTimeSetListener接口并传入相应的实现类实例来监听用户在对话框中完成日期时间选择并点击确定按钮后的事件
// 以便在该事件触发时执行自定义的业务逻辑比如保存选择的日期时间到数据库、更新相关UI显示等操作。
public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) {
mOnDateTimeSetListener = callBack;
}
// 私有方法用于更新对话框的标题显示内容根据传入的日期时间以毫秒为单位的时间戳date来进行格式化并设置为对话框的标题。
// 首先会定义一个整数类型的变量flag用于设置日期时间格式化的标志位通过按位或操作组合多个标志位确定要显示的日期时间信息的格式。
// 例如这里设置了显示年、显示日期、显示时间等标志位并且根据当前是否是24小时制视图模式由mIs24HourView变量决定来添加对应的24小时制或12小时制的格式化标志位。
// 最后通过DateUtils.formatDateTime方法传入应用的上下文环境this.getContext()、日期时间时间戳date以及格式化标志位flag
// 将格式化后的字符串设置为对话框的标题,使得对话框标题能准确展示当前选择的日期时间信息,并且符合相应的时间格式要求。
private void updateTitle(long date) {
int flag =
DateUtils.FORMAT_SHOW_YEAR |
DateUtils.FORMAT_SHOW_DATE |
DateUtils.FORMAT_SHOW_TIME;
flag |= mIs24HourView? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_12HOUR;
setTitle(DateUtils.formatDateTime(this.getContext(), date, flag));
}
// 实现OnClickListener接口中的onClick方法用于处理对话框中按钮的点击事件这里主要处理确定按钮的点击事件因为取消按钮点击时没有额外设置监听器会执行默认操作
// 当用户点击确定按钮时会判断是否已经设置了日期时间设置监听器通过判断mOnDateTimeSetListener是否为null
// 如果已经设置了有效的监听器就会触发该监听器的OnDateTimeSet方法并传入当前的对话框实例this以及mDate对象的时间戳通过getTimeInMillis方法获取
// 使得外部实现了OnDateTimeSetListener接口的类能够接收到用户选择的日期时间信息并执行相应的业务逻辑比如保存选择的日期时间到数据库、更新相关UI显示等操作。
public void onClick(DialogInterface arg0, int arg1) {
if (mOnDateTimeSetListener!= null) {
mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis());
}
}
}