|
|
/*
|
|
|
* 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());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
} |