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.
xiaomi/ui/DateTimePickerDialog.java

125 lines
8.8 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)
*
* 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;
import java.util.Calendar;
import net.micode.notes.R;
import net.micode.notes.ui.DateTimePicker;
import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
// DateTimePickerDialog类继承自AlertDialog同时实现了OnClickListener接口它是一个自定义的对话框类用于展示日期和时间选择的界面并在用户操作后返回选择的日期时间结果方便用户在应用中进行日期时间的设置操作。
public class DateTimePickerDialog extends AlertDialog implements OnClickListener {
// Calendar对象用于存储当前在对话框中显示和操作的日期时间信息初始化为当前系统时间后续会根据用户在日期时间选择器中的操作进行更新。
private Calendar mDate = Calendar.getInstance();
// 用于标记是否处于24小时制视图决定了日期时间选择器以及对话框标题中时间显示的格式12小时制或24小时制
private boolean mIs24HourView;
// 定义一个接口类型的变量,用于设置当用户在对话框中点击确定按钮并设置好日期时间后触发的回调监听器,外部类可实现该接口来处理用户选择的日期时间结果。
private OnDateTimeSetListener mOnDateTimeSetListener;
// 用于显示日期和时间选择界面的DateTimePicker实例用户通过它来实际操作选择具体的年、月、日、时、分等信息。
private DateTimePicker mDateTimePicker;
// 定义一个接口,供外部类实现,当用户在对话框中完成日期时间设置并点击确定按钮后,会调用该接口中的方法,将对话框实例以及选择的日期时间(以毫秒为单位的时间戳)传递给外部类进行后续处理。
public interface OnDateTimeSetListener {
void OnDateTimeSet(AlertDialog dialog, long date);
}
// 构造函数创建一个DateTimePickerDialog实例传入上下文Context以及初始的日期时间以毫秒为单位的时间戳参数用于初始化对话框的相关属性和显示内容。
public DateTimePickerDialog(Context context, long date) {
super(context);
// 创建一个DateTimePicker实例用于在对话框中展示日期时间选择的界面它内部包含了各种选择器如日期、小时、分钟等选择器供用户操作。
mDateTimePicker = new DateTimePicker(context);
// 将创建的DateTimePicker视图设置为对话框的主要显示内容使得对话框展示出日期时间选择的界面给用户。
setView(mDateTimePicker);
// 为DateTimePicker设置日期时间改变的监听器当用户在DateTimePicker上操作改变了日期、时间等信息时会触发该监听器的onDateTimeChanged方法。
mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() {
public void onDateTimeChanged(DateTimePicker view, int year, int month,
int dayOfMonth, int hourOfDay, int minute) {
// 根据用户在DateTimePicker上选择的新日期时间信息更新内部存储的Calendar对象mDate的年、月、日、时、分等字段使其保持与用户选择一致。
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方法根据更新后的日期时间信息来更新对话框的标题使其显示当前选择的日期时间。
updateTitle(mDate.getTimeInMillis());
}
});
// 设置内部存储的Calendar对象mDate的时间为传入的初始日期时间并将秒数设置为0确保初始时间的准确性和一致性。
mDate.setTimeInMillis(date);
mDate.set(Calendar.SECOND, 0);
// 将DateTimePicker的当前显示日期时间设置为与内部存储的Calendar对象mDate一致保证初始界面显示的时间是传入的初始时间。
mDateTimePicker.setCurrentDate(mDate.getTimeInMillis());
// 设置对话框的“确定”按钮文本从资源文件中获取对应的字符串以及点击该按钮的监听器为当前类实例因为实现了OnClickListener接口当用户点击“确定”按钮时会触发onClick方法进行相应处理。
setButton(context.getString(R.string.datetime_dialog_ok), this);
// 设置对话框的“取消”按钮文本从资源文件中获取对应的字符串以及点击该按钮的监听器为null意味着点击“取消”按钮时不做额外的特定操作通常会关闭对话框
setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null);
// 根据系统当前的时间格式设置是否为24小时制来初始化对话框的时间显示格式调用set24HourView方法进行设置同时会影响DateTimePicker内部时间选择器的显示格式。
set24HourView(DateFormat.is24HourFormat(this.getContext()));
// 初次更新对话框的标题使其显示初始的日期时间信息调用updateTitle方法根据当前的日期时间来设置合适的标题内容。
updateTitle(mDate.getTimeInMillis());
}
// 用于设置对话框是否采用24小时制视图的方法通过传入的布尔值参数来更新内部的mIs24HourView标记并相应地影响日期时间选择器以及对话框标题中时间显示的格式。
public void set24HourView(boolean is24HourView) {
mIs24HourView = is24HourView;
}
// 用于设置当用户在对话框中点击确定按钮后触发的回调监听器的方法外部类可以通过传入实现了OnDateTimeSetListener接口的实例来处理用户选择的日期时间结果。
public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) {
mOnDateTimeSetListener = callBack;
}
// 私有方法用于更新对话框的标题内容根据传入的日期时间以毫秒为单位的时间戳以及当前设置的时间显示格式24小时制或12小时制等信息生成合适的标题字符串并设置给对话框。
private void updateTitle(long date) {
int flag =
DateUtils.FORMAT_SHOW_YEAR | // 设置显示年份的格式标志
DateUtils.FORMAT_SHOW_DATE | // 设置显示日期(月、日等)的格式标志
DateUtils.FORMAT_SHOW_TIME; // 设置显示时间(时、分等)的格式标志
// 根据是否为24小时制视图添加对应的时间格式标志用于控制时间在标题中的显示格式24小时制或12小时制
flag |= mIs24HourView? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_12HOUR;
// 使用DateUtils工具类的formatDateTime方法根据传入的上下文、日期时间以及格式标志等信息生成格式化后的日期时间字符串并设置为对话框的标题内容。
setTitle(DateUtils.formatDateTime(this.getContext(), date, flag));
}
// 实现OnClickListener接口的方法当用户点击对话框中的按钮如“确定”按钮时会被调用根据按钮的点击情况以及是否设置了OnDateTimeSetListener监听器进行相应的操作例如将用户选择的日期时间结果传递给外部监听器进行处理。
public void onClick(DialogInterface arg0, int arg1) {
if (mOnDateTimeSetListener!= null) {
// 如果设置了OnDateTimeSetListener监听器调用其OnDateTimeSet方法将当前对话框实例以及用户选择的日期时间通过内部存储的Calendar对象获取时间戳传递给外部类进行后续处理。
mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis());
}
}
}