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

204 lines
11 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.
*/
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;
public class DateTimePickerDialog extends AlertDialog implements OnClickListener {
private Calendar mDate = Calendar.getInstance();
private boolean mIs24HourView;
private OnDateTimeSetListener mOnDateTimeSetListener;
private DateTimePicker mDateTimePicker;
public interface OnDateTimeSetListener {
void OnDateTimeSet(AlertDialog dialog, long date);
}
public DateTimePickerDialog(Context context, long date) {
super(context);
mDateTimePicker = new DateTimePicker(context);
setView(mDateTimePicker);
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());
}
});
mDate.setTimeInMillis(date);
mDate.set(Calendar.SECOND, 0);
mDateTimePicker.setCurrentDate(mDate.getTimeInMillis());
setButton(context.getString(R.string.datetime_dialog_ok), this);
setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null);
set24HourView(DateFormat.is24HourFormat(this.getContext()));
updateTitle(mDate.getTimeInMillis());
}
public void set24HourView(boolean is24HourView) {
mIs24HourView = is24HourView;
}
public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) {
mOnDateTimeSetListener = callBack;
}
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_24HOUR;
setTitle(DateUtils.formatDateTime(this.getContext(), date, flag));
}
public void onClick(DialogInterface arg0, int arg1) {
if (mOnDateTimeSetListener != null) {
mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis());
}
}
}
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它是一个自定义的对话框组件用于展示日期和时间选择的交互界面
// 内部包含了DateTimePicker组件来实现具体的日期时间选择功能并提供了设置选择结果监听器等功能方便用户在对话框中选择日期和时间并获取选择结果。
public class DateTimePickerDialog extends AlertDialog implements OnClickListener {
// 用于存储当前选择的日期和时间信息基于Calendar类实现初始化为当前系统时间后续会根据用户在对话框中的选择进行更新
private Calendar mDate = Calendar.getInstance();
// 用于标识当前是否处于24小时制视图模式true表示24小时制false表示12小时制初始值会根据系统设置来确定
private boolean mIs24HourView;
// 定义一个接口类型的成员变量,用于设置当用户点击确定按钮完成日期和时间选择后触发的回调监听器,外部类可以实现该接口来获取选择结果
private OnDateTimeSetListener mOnDateTimeSetListener;
// 用于展示和操作日期时间选择的具体组件是DateTimePickerDialog的核心子组件用户通过它来实际选择日期和时间
private DateTimePicker mDateTimePicker;
// 定义一个接口,用于外部类实现,以便在用户完成日期和时间选择并点击确定按钮后接收通知并获取选择的日期时间信息(以毫秒为单位的时间戳形式)
public interface OnDateTimeSetListener {
void OnDateTimeSet(AlertDialog dialog, long date);
}
// 构造函数用于创建DateTimePickerDialog实例传入上下文和初始的日期时间以毫秒为单位的时间戳
public DateTimePickerDialog(Context context, long date) {
super(context);
// 创建一个DateTimePicker实例用于在对话框中展示日期和时间选择的交互界面传入当前上下文它会根据默认设置显示初始的日期时间等信息
mDateTimePicker = new DateTimePicker(context);
// 将创建的DateTimePicker组件设置为对话框的内容视图这样对话框展示时就会显示日期时间选择的相关界面
setView(mDateTimePicker);
// 为DateTimePicker组件设置日期和时间变化的监听器当用户在DateTimePicker中改变了日期、时间等信息时触发相应逻辑
mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() {
public void onDateTimeChanged(DateTimePicker view, int year, int month,
int dayOfMonth, int hourOfDay, int minute) {
// 根据用户选择的新的年、月、日、时、分信息更新内部存储的Calendar对象mDate中的对应字段使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
mDate.setTimeInMillis(date);
// 将秒数设置为0确保在处理日期时间时秒数处于初始默认状态可能是为了统一和简化选择的时间精度只精确到分钟级别
mDate.set(Calendar.SECOND, 0);
// 将当前的日期和时间信息设置到DateTimePicker组件中使其初始展示的内容与传入的初始日期时间一致
mDateTimePicker.setCurrentDate(mDate.getTimeInMillis());
// 设置对话框的确定按钮按钮文本从资源文件中获取通过R.string.datetime_dialog_ok获取对应的字符串资源并将当前类实现了OnClickListener接口作为点击事件的监听器传入
setButton(context.getString(R.string.datetime_dialog_ok), this);
// 设置对话框的取消按钮按钮文本从资源文件中获取通过R.string.datetime_dialog_cancel获取对应的字符串资源传入null表示使用默认的取消按钮行为通常是关闭对话框
setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null);
// 根据系统设置判断是否采用24小时制视图模式调用set24HourView方法进行相应设置并更新对话框标题等相关显示信息
set24HourView(DateFormat.is24HourFormat(this.getContext()));
updateTitle(mDate.getTimeInMillis());
}
// 用于设置对话框的日期时间选择界面是否采用24小时制视图模式更新内部的标识变量并可能影响DateTimePicker组件的显示例如AM/PM选择器的可见性等
public void set24HourView(boolean is24HourView) {
mIs24HourView = is24HourView;
}
// 用于设置当用户点击确定按钮完成日期和时间选择后触发的回调监听器外部类可以通过实现OnDateTimeSetListener接口并传入相应实例来处理选择结果
public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) {
mOnDateTimeSetListener = callBack;
}
// 私有方法用于更新对话框的标题根据传入的日期时间以毫秒为单位的时间戳以及当前的24小时制视图模式标识等信息格式化并设置标题显示的内容
private void updateTitle(long date) {
// 定义用于格式化日期时间显示的标志位,包括显示年、日期、时间等信息
int flag =
DateUtils.FORMAT_SHOW_YEAR |
DateUtils.FORMAT_SHOW_DATE |
DateUtils.FORMAT_SHOW_TIME;
// 根据当前是否处于24小时制视图模式添加对应的格式化标志以便正确格式化时间显示是采用24小时制还是12小时制带AM/PM标识的格式
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) {
mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis());
}
}
}