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; /** * @Package: net.micode.notes.ui * @ClassName: DateTimePickerDialog * @Description: * DateTimePickerDialog是一个自定义对话框,允许用户选择日期和时间。 * 它继承自AlertDialog类,并实现OnClickListener接口。 * 对话框包含一个DateTimePicker控件,用于选择日期和时间。 * 通过OnDateTimeSetListener接口将选择的日期和时间传递给监听器。 * 对话框还提供了设置24小时制和使用选择的日期更新对话框标题的方法。 * onClick方法处理按钮点击事件,并在日期和时间设置完成时通知监听器。 * @Author: YangYizhe * @CreateDate: 12/21/2023 12:32 AM * @Version: 1.0 */ 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); } /** * @method DateTimePickerDialog * @description * 构造一个新的DateTimePickerDialog * Remind me功能的对话框 * @date: 12/21/2023 8:01 AM * @author: YangYizhe * @param context 上下文环境。 * @param 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()); } /** * 设置对话框是否为24小时制。 * * @param is24HourView 如果对话框为24小时制,则为true;否则为false。 */ public void set24HourView(boolean is24HourView) { mIs24HourView = is24HourView; } /** * 设置日期和时间设置监听器。 * * @param callBack 要通知的监听器。 */ public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) { mOnDateTimeSetListener = callBack; } /** * 使用指定的日期更新对话框标题。 * * @param date 要显示在标题中的日期。 */ 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)); } /** * 处理按钮点击事件。 * * @param arg0 接收到点击事件的对话框。 * @param arg1 被点击的按钮。 */ public void onClick(DialogInterface arg0, int arg1) { if (mOnDateTimeSetListener != null) { mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); } } }