创建src和doc文件夹,存放DateTimePickerDialog.java和需求规格说明书

liumingming_branch
刘明明 3 weeks ago
parent 66a2de1006
commit ae65aeec34

@ -0,0 +1,362 @@
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.LinearLayout;
import android.widget.TimePicker;
import android.widget.Toast;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
/**
* DateTimePickerDialog
*
*/
public class DateTimePickerDialog extends AlertDialog {
// 回调接口
public interface OnDateTimeSetListener {
void onDateTimeSet(DateTimePickerDialog dialog, int year, int month, int day, int hourOfDay, int minute);
}
// 组件
private CalendarView mCalendarView;
private TimePicker mTimePicker;
private LinearLayout mDateTimeContainer;
// 日期时间相关
private Calendar mCalendar;
private Calendar mMinDateCalendar;
private Calendar mMaxDateCalendar;
// 回调
private OnDateTimeSetListener mListener;
// 配置选项
private boolean mIs24HourView = true;
private boolean mShowTimePicker = true;
private int mThemeResId = 0;
/**
*
* @param context
*/
public DateTimePickerDialog(Context context) {
super(context);
init(context);
}
/**
*
* @param context
* @param themeResId ID
*/
public DateTimePickerDialog(Context context, int themeResId) {
super(context, themeResId);
mThemeResId = themeResId;
init(context);
}
/**
*
* @param context
* @param listener
* @param year
* @param month (0-11)
* @param day
* @param hourOfDay
* @param minute
*/
public DateTimePickerDialog(Context context, OnDateTimeSetListener listener,
int year, int month, int day, int hourOfDay, int minute) {
super(context);
mListener = listener;
mCalendar = Calendar.getInstance();
mCalendar.set(year, month, day, hourOfDay, minute);
init(context);
}
/**
*
* @param context
* @param themeResId ID
* @param listener
* @param year
* @param month (0-11)
* @param day
* @param hourOfDay
* @param minute
*/
public DateTimePickerDialog(Context context, int themeResId, OnDateTimeSetListener listener,
int year, int month, int day, int hourOfDay, int minute) {
super(context, themeResId);
mThemeResId = themeResId;
mListener = listener;
mCalendar = Calendar.getInstance();
mCalendar.set(year, month, day, hourOfDay, minute);
init(context);
}
/**
*
* @param context
*/
private void init(Context context) {
// 确保日历实例存在
if (mCalendar == null) {
mCalendar = Calendar.getInstance();
}
// 设置对话框标题
setTitle(R.string.date_time_picker_title);
// 加载布局
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.dialog_date_time_picker, null);
setView(view);
// 初始化组件
mDateTimeContainer = view.findViewById(R.id.date_time_container);
mCalendarView = view.findViewById(R.id.calendar_view);
mTimePicker = view.findViewById(R.id.time_picker);
// 配置时间选择器
mIs24HourView = DateFormat.is24HourFormat(context);
mTimePicker.setIs24HourView(mIs24HourView);
// 设置初始日期时间
updateDateTimeDisplay();
// 设置日期选择监听器
mCalendarView.setOnDateChangeListener((view1, year, month, dayOfMonth) -> {
mCalendar.set(Calendar.YEAR, year);
mCalendar.set(Calendar.MONTH, month);
mCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
// 检查日期是否在有效范围内
if (!isDateInRange(mCalendar.getTime())) {
Toast.makeText(context, R.string.date_out_of_range, Toast.LENGTH_SHORT).show();
// 重置到之前的日期
updateDateTimeDisplay();
}
});
// 设置时间选择监听器
mTimePicker.setOnTimeChangedListener((view12, hourOfDay, minute) -> {
mCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
mCalendar.set(Calendar.MINUTE, minute);
});
// 设置按钮
setButton(DialogInterface.BUTTON_POSITIVE, context.getString(R.string.ok), (dialog, which) -> {
if (mListener != null) {
mListener.onDateTimeSet(this,
mCalendar.get(Calendar.YEAR),
mCalendar.get(Calendar.MONTH),
mCalendar.get(Calendar.DAY_OF_MONTH),
mCalendar.get(Calendar.HOUR_OF_DAY),
mCalendar.get(Calendar.MINUTE)
);
}
});
setButton(DialogInterface.BUTTON_NEGATIVE, context.getString(R.string.cancel), (dialog, which) -> {
cancel();
});
}
/**
*
*/
private void updateDateTimeDisplay() {
if (mCalendarView != null && mTimePicker != null) {
mCalendarView.setDate(mCalendar.getTimeInMillis());
mTimePicker.setCurrentHour(mCalendar.get(Calendar.HOUR_OF_DAY));
mTimePicker.setCurrentMinute(mCalendar.get(Calendar.MINUTE));
}
}
/**
*
* @param date
* @return
*/
private boolean isDateInRange(Date date) {
if (mMinDateCalendar != null && date.before(mMinDateCalendar.getTime())) {
return false;
}
if (mMaxDateCalendar != null && date.after(mMaxDateCalendar.getTime())) {
return false;
}
return true;
}
// ==================== 公共方法 ====================
/**
*
* @param showTimePicker
*/
public void setShowTimePicker(boolean showTimePicker) {
mShowTimePicker = showTimePicker;
if (mTimePicker != null) {
mTimePicker.setVisibility(showTimePicker ? View.VISIBLE : View.GONE);
}
}
/**
* 使24
* @param is24HourView 使24
*/
public void setIs24HourView(boolean is24HourView) {
mIs24HourView = is24HourView;
if (mTimePicker != null) {
mTimePicker.setIs24HourView(is24HourView);
}
}
/**
*
* @param minDate
*/
public void setMinDate(Date minDate) {
if (minDate != null) {
mMinDateCalendar = Calendar.getInstance();
mMinDateCalendar.setTime(minDate);
if (mCalendarView != null) {
mCalendarView.setMinDate(minDate.getTime());
}
}
}
/**
*
* @param minDate
*/
public void setMinDate(long minDate) {
Date date = new Date(minDate);
setMinDate(date);
}
/**
*
* @param maxDate
*/
public void setMaxDate(Date maxDate) {
if (maxDate != null) {
mMaxDateCalendar = Calendar.getInstance();
mMaxDateCalendar.setTime(maxDate);
if (mCalendarView != null) {
mCalendarView.setMaxDate(maxDate.getTime());
}
}
}
/**
*
* @param maxDate
*/
public void setMaxDate(long maxDate) {
Date date = new Date(maxDate);
setMaxDate(date);
}
/**
*
* @param listener
*/
public void setOnDateTimeSetListener(OnDateTimeSetListener listener) {
mListener = listener;
}
/**
*
* @param dateTime
*/
public void setDateTime(Date dateTime) {
if (dateTime != null) {
mCalendar.setTime(dateTime);
updateDateTimeDisplay();
}
}
/**
*
* @param year
* @param month (0-11)
* @param day
* @param hourOfDay
* @param minute
*/
public void setDateTime(int year, int month, int day, int hourOfDay, int minute) {
mCalendar.set(year, month, day, hourOfDay, minute);
updateDateTimeDisplay();
}
/**
*
* @return
*/
public Date getDateTime() {
return mCalendar.getTime();
}
/**
*
* @param styleResId ID
*/
public void applyStyle(int styleResId) {
if (styleResId > 0 && mDateTimeContainer != null) {
mDateTimeContainer.setBackgroundResource(styleResId);
}
}
/**
*
* @param locale
*/
public void setLocale(Locale locale) {
if (locale != null) {
Configuration config = new Configuration(getContext().getResources().getConfiguration());
config.setLocale(locale);
getContext().getResources().updateConfiguration(config, getContext().getResources().getDisplayMetrics());
// 重新初始化以应用语言变化
init(getContext());
}
}
// ==================== 错误处理 ====================
/**
*
* @return
*/
public boolean validateDateTime() {
return isDateInRange(mCalendar.getTime());
}
/**
*
* @param errorMessage
*/
public void showError(String errorMessage) {
Toast.makeText(getContext(), errorMessage, Toast.LENGTH_LONG).show();
}
/**
*
* @param errorResId ID
*/
public void showError(int errorResId) {
Toast.makeText(getContext(), errorResId, Toast.LENGTH_LONG).show();
}
}

@ -0,0 +1,76 @@
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private TextView mSelectedDateTimeText;
private Button mShowPickerButton;
private SimpleDateFormat mDateFormat;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSelectedDateTimeText = findViewById(R.id.selected_date_time);
mShowPickerButton = findViewById(R.id.show_picker_button);
mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault());
mShowPickerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDateTimePicker();
}
});
}
private void showDateTimePicker() {
// 获取当前时间作为初始值
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
// 创建并配置DateTimePickerDialog
DateTimePickerDialog dialog = new DateTimePickerDialog(
this,
(dateTimePickerDialog, year1, month1, day1, hourOfDay, minute1) -> {
// 处理选择结果
Calendar selectedCalendar = Calendar.getInstance();
selectedCalendar.set(year1, month1, day1, hourOfDay, minute1);
Date selectedDate = selectedCalendar.getTime();
// 显示选择结果
mSelectedDateTimeText.setText("选择的日期时间: " + mDateFormat.format(selectedDate));
Toast.makeText(MainActivity.this, "选择了: " + mDateFormat.format(selectedDate), Toast.LENGTH_SHORT).show();
},
year, month, day, hour, minute
);
// 设置最小日期为当前日期
dialog.setMinDate(new Date());
// 设置最大日期为30天后
Calendar maxCalendar = Calendar.getInstance();
maxCalendar.add(Calendar.DAY_OF_YEAR, 30);
dialog.setMaxDate(maxCalendar.getTime());
// 设置为24小时制
dialog.setIs24HourView(true);
// 显示对话框
dialog.show();
}
}

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/selected_date_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="选择的日期时间: 未选择"
android:textSize="18sp"
android:layout_marginBottom="24dp"
android:gravity="center" />
<Button
android:id="@+id/show_picker_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示日期时间选择器"
android:textSize="16sp"
android:padding="12dp" />
</LinearLayout>

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/date_time_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<!-- 日期选择器 -->
<CalendarView
android:id="@+id/calendar_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp" />
<!-- 时间选择器 -->
<TimePicker
android:id="@+id/time_picker"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="date_time_picker_title">选择日期时间</string>
<string name="ok">确定</string>
<string name="cancel">取消</string>
<string name="date_out_of_range">所选日期超出范围</string>
</resources>
Loading…
Cancel
Save