From 4d76cdfd29dedfbbc2f2722692cf675e77067afe Mon Sep 17 00:00:00 2001 From: pq5n3hobs Date: Thu, 19 Dec 2024 20:55:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E4=BB=A3=E7=A0=815?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DateTimePickerDialog.java | 121 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 DateTimePickerDialog.java diff --git a/DateTimePickerDialog.java b/DateTimePickerDialog.java new file mode 100644 index 0000000..59604e4 --- /dev/null +++ b/DateTimePickerDialog.java @@ -0,0 +1,121 @@ +/* + * 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; + +// DateTimePickerDialog类继承自AlertDialog,说明它是一个基于对话框的自定义组件,用于展示日期和时间选择界面,并与用户进行交互 +// 同时实现了OnClickListener接口,用于处理对话框按钮点击等相关的点击事件逻辑 +public class DateTimePickerDialog extends AlertDialog implements OnClickListener { + + // 使用Calendar对象来存储当前选择的日期和时间信息,初始化为获取当前时间的实例,方便后续进行时间相关的操作和获取具体的时间字段值 + private Calendar mDate = Calendar.getInstance(); + // 用于标记是否处于24小时制视图模式(true表示24小时制,false表示12小时制),决定了日期时间显示等相关逻辑 + private boolean mIs24HourView; + // 定义一个接口类型的成员变量,用于设置当用户在对话框中确认选择日期和时间后的回调监听器,外部类可以实现该接口来响应最终的选择操作 + private OnDateTimeSetListener mOnDateTimeSetListener; + // 用于显示和操作日期时间选择的自定义视图组件(DateTimePicker)实例,通过它用户可以在对话框中直观地选择具体的日期和时间 + private DateTimePicker mDateTimePicker; + + // 定义一个接口,用于外部类实现,当用户在对话框中点击确定按钮,完成日期和时间选择后,会回调此接口的OnDateTimeSet方法 + // 外部类可以通过实现该接口获取到最终选择的日期时间信息(以毫秒数表示的时间戳),并进行相应的业务处理,比如保存数据、更新显示等操作 + 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()); + } + }); + + // 设置初始的日期时间信息,将传入的时间戳(date)设置到Calendar对象(mDate)中,用于初始化显示在DateTimePicker组件中的日期时间 + mDate.setTimeInMillis(date); + // 将秒数设置为0,可能是为了统一初始时间的精度或者符合某种业务逻辑要求,确保在选择时间时以整分钟为基础(去除秒数的影响) + mDate.set(Calendar.SECOND, 0); + // 将当前的日期时间信息设置到DateTimePicker组件中,使其显示对应的初始日期和时间,供用户进行后续的调整选择 + mDateTimePicker.setCurrentDate(mDate.getTimeInMillis()); + + // 设置对话框的确定按钮(OK按钮),传入按钮显示的文本内容(通过资源字符串获取,对应R.string.datetime_dialog_ok)以及设置当前类(this)作为按钮点击事件的监听器 + setButton(context.getString(R.string.datetime_dialog_ok), this); + // 设置对话框的取消按钮(Cancel按钮),传入按钮显示的文本内容(通过资源字符串获取,对应R.string.datetime_dialog_cancel),并将监听器设置为null,表示取消按钮点击时不做额外的逻辑处理(默认关闭对话框等基本行为) + setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null); + + // 根据当前设备的时间格式设置(是否为24小时制)来初始化对话框中日期时间显示的时间制模式,调用DateFormat.is24HourFormat方法判断 + set24HourView(DateFormat.is24HourFormat(this.getContext())); + // 根据初始的日期时间信息,调用updateTitle方法来初始化对话框标题显示的日期时间文本内容 + updateTitle(mDate.getTimeInMillis()); + } + + // 用于设置对话框中日期时间显示的时间制模式(24小时制或12小时制),传入参数is24HourView决定具体的模式设置 + public void set24HourView(boolean is24HourView) { + mIs24HourView = is24HourView; + } + + // 用于设置当用户点击对话框确定按钮完成日期时间选择后的回调监听器,外部类可以通过实现OnDateTimeSetListener接口传入相应的实现类实例 + public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) { + mOnDateTimeSetListener = callBack; + } + + // 私有方法,用于根据给定的日期时间(以毫秒数表示的时间戳)更新对话框标题显示的日期时间文本内容 + // 通过设置不同的格式化标志(DateUtils中的相关常量),按照指定的格式(是否显示年、月、日、时间以及时间制等)来格式化日期时间文本 + 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方法,用于处理对话框按钮(确定按钮,因为取消按钮设置监听器为null)点击事件的逻辑 + // 当用户点击确定按钮时,如果设置了OnDateTimeSetListener回调监听器,就会调用其OnDateTimeSet方法,将当前对话框实例以及最终选择的日期时间信息(以毫秒数表示的时间戳)传递给外部监听者 + public void onClick(DialogInterface arg0, int arg1) { + if (mOnDateTimeSetListener!= null) { + mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); + } + } + +} \ No newline at end of file