一个对话框中的 Android 日期时间选择器

Posted

技术标签:

【中文标题】一个对话框中的 Android 日期时间选择器【英文标题】:Android Date Time picker in one dialog 【发布时间】:2016-11-30 22:40:09 【问题描述】:

我正在为我的 android 应用程序使用材料 Date Time 选择器。但我想在一个对话框中组合 DateTime 选择器。

我关注this one。但我需要在日期选择之后立即选择时间。

请提出可能的方法来做到这一点。

【问题讨论】:

你可以查看github.com/jjobes/SlideDateTimePicker 【参考方案1】:

试试这个代码:

CustomDateTimePicker.java

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TimePicker;
import android.widget.ViewSwitcher;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * Created by admin on 6/29/2016.
 */
public class CustomDateTimePicker implements View.OnClickListener 
    private DatePicker datePicker;
    private TimePicker timePicker;
    private ViewSwitcher viewSwitcher;

    private final int SET_DATE = 100, SET_TIME = 101, SET = 102, CANCEL = 103;

    private Button btn_setDate, btn_setTime, btn_set, btn_cancel;

    private Calendar calendar_date = null;

    private Activity activity;

    private ICustomDateTimeListener iCustomDateTimeListener = null;

    private Dialog dialog;

    private boolean is24HourView = true, isAutoDismiss = true;

    private int selectedHour, selectedMinute;

    public CustomDateTimePicker(Activity a,
                                ICustomDateTimeListener customDateTimeListener) 
        activity = a;
        iCustomDateTimeListener = customDateTimeListener;

        dialog = new Dialog(activity);
        dialog.setOnDismissListener(new DialogInterface.OnDismissListener() 
            @Override
            public void onDismiss(DialogInterface dialog) 
                resetData();
            
        );

        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        View dialogView = getDateTimePickerLayout();
        dialog.setContentView(dialogView);
    

    public View getDateTimePickerLayout() 
        LinearLayout.LayoutParams linear_match_wrap = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT);
        LinearLayout.LayoutParams linear_wrap_wrap = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        FrameLayout.LayoutParams frame_match_wrap = new FrameLayout.LayoutParams(
                FrameLayout.LayoutParams.MATCH_PARENT,
                FrameLayout.LayoutParams.WRAP_CONTENT);

        LinearLayout.LayoutParams button_params = new LinearLayout.LayoutParams(
                0, LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f);

        LinearLayout linear_main = new LinearLayout(activity);
        linear_main.setLayoutParams(linear_match_wrap);
        linear_main.setOrientation(LinearLayout.VERTICAL);
        linear_main.setGravity(Gravity.CENTER);

        LinearLayout linear_child = new LinearLayout(activity);
        linear_child.setLayoutParams(linear_wrap_wrap);
        linear_child.setOrientation(LinearLayout.VERTICAL);

        LinearLayout linear_top = new LinearLayout(activity);
        linear_top.setLayoutParams(linear_match_wrap);

        btn_setDate = new Button(activity);
        btn_setDate.setLayoutParams(button_params);
        btn_setDate.setText("Set Date");
        btn_setDate.setId(SET_DATE);
        btn_setDate.setOnClickListener(this);

        btn_setTime = new Button(activity);
        btn_setTime.setLayoutParams(button_params);
        btn_setTime.setText("Set Time");
        btn_setTime.setId(SET_TIME);
        btn_setTime.setOnClickListener(this);

        linear_top.addView(btn_setDate);
        linear_top.addView(btn_setTime);

        viewSwitcher = new ViewSwitcher(activity);
        viewSwitcher.setLayoutParams(frame_match_wrap);

        datePicker = new DatePicker(activity);
        timePicker = new TimePicker(activity);
        timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() 
            @Override
            public void onTimeChanged(TimePicker view, int hourOfDay, int minute) 
                selectedHour = hourOfDay;
                selectedMinute = minute;
            
        );

        viewSwitcher.addView(timePicker);
        viewSwitcher.addView(datePicker);

        LinearLayout linear_bottom = new LinearLayout(activity);
        linear_match_wrap.topMargin = 8;
        linear_bottom.setLayoutParams(linear_match_wrap);

        btn_set = new Button(activity);
        btn_set.setLayoutParams(button_params);
        btn_set.setText("Set");
        btn_set.setId(SET);
        btn_set.setOnClickListener(this);

        btn_cancel = new Button(activity);
        btn_cancel.setLayoutParams(button_params);
        btn_cancel.setText("Cancel");
        btn_cancel.setId(CANCEL);
        btn_cancel.setOnClickListener(this);

        linear_bottom.addView(btn_set);
        linear_bottom.addView(btn_cancel);

        linear_child.addView(linear_top);
        linear_child.addView(viewSwitcher);
        linear_child.addView(linear_bottom);

        linear_main.addView(linear_child);

        return linear_main;
    

    public void showDialog() 
        if (!dialog.isShowing()) 
            if (calendar_date == null)
                calendar_date = Calendar.getInstance();

            selectedHour = calendar_date.get(Calendar.HOUR_OF_DAY);
            selectedMinute = calendar_date.get(Calendar.MINUTE);

            timePicker.setIs24HourView(is24HourView);
            timePicker.setCurrentHour(selectedHour);
            timePicker.setCurrentMinute(selectedMinute);

            datePicker.updateDate(calendar_date.get(Calendar.YEAR),
                    calendar_date.get(Calendar.MONTH),
                    calendar_date.get(Calendar.DATE));

            dialog.show();

            btn_setDate.performClick();
        
    

    public void setAutoDismiss(boolean isAutoDismiss) 
        this.isAutoDismiss = isAutoDismiss;
    

    public void dismissDialog() 
        if (!dialog.isShowing())
            dialog.dismiss();
    

    public void setDate(Calendar calendar) 
        if (calendar != null)
            calendar_date = calendar;
    

    public void setDate(Date date) 
        if (date != null) 
            calendar_date = Calendar.getInstance();
            calendar_date.setTime(date);
        
    

    public void setDate(int year, int month, int day) 
        if (month < 12 && month >= 0 && day < 32 && day >= 0 && year > 100
                && year < 3000) 
            calendar_date = Calendar.getInstance();
            calendar_date.set(year, month, day);
        

    

    public void setTimeIn24HourFormat(int hourIn24Format, int minute) 
        if (hourIn24Format < 24 && hourIn24Format >= 0 && minute >= 0
                && minute < 60) 
            if (calendar_date == null)
                calendar_date = Calendar.getInstance();

            calendar_date.set(calendar_date.get(Calendar.YEAR),
                    calendar_date.get(Calendar.MONTH),
                    calendar_date.get(Calendar.DAY_OF_MONTH), hourIn24Format,
                    minute);

            is24HourView = true;
        
    

    public void setTimeIn12HourFormat(int hourIn12Format, int minute,
                                      boolean isAM) 
        if (hourIn12Format < 13 && hourIn12Format > 0 && minute >= 0
                && minute < 60) 
            if (hourIn12Format == 12)
                hourIn12Format = 0;

            int hourIn24Format = hourIn12Format;

            if (!isAM)
                hourIn24Format += 12;

            if (calendar_date == null)
                calendar_date = Calendar.getInstance();

            calendar_date.set(calendar_date.get(Calendar.YEAR),
                    calendar_date.get(Calendar.MONTH),
                    calendar_date.get(Calendar.DAY_OF_MONTH), hourIn24Format,
                    minute);

            is24HourView = false;
        
    

    public void set24HourFormat(boolean is24HourFormat) 
        is24HourView = is24HourFormat;
    

    public interface ICustomDateTimeListener 
        public void onSet(Dialog dialog, Calendar calendarSelected,
                          Date dateSelected, int year, String monthFullName,
                          String monthShortName, int monthNumber, int day,
                          String weekDayFullName, String weekDayShortName, int hour24,
                          int hour12, int min, int sec, String AM_PM);

        public void onCancel();
    

    @Override
    public void onClick(View v) 
        switch (v.getId()) 
            case SET_DATE:
            btn_setTime.setEnabled(true);
            btn_setDate.setEnabled(false);

            if (viewSwitcher.getCurrentView() != datePicker) 
                viewSwitcher.showPrevious();
            
            break;

        case SET_TIME:
            btn_setTime.setEnabled(false);
            btn_setDate.setEnabled(true);
            if (viewSwitcher.getCurrentView() == datePicker) 
                viewSwitcher.showNext();
            
            break;


            case SET:
                if (iCustomDateTimeListener != null) 
                    int month = datePicker.getMonth();
                    int year = datePicker.getYear();
                    int day = datePicker.getDayOfMonth();


                    calendar_date.set(year, month, day, selectedHour,
                            selectedMinute);

                    iCustomDateTimeListener.onSet(dialog, calendar_date,
                            calendar_date.getTime(), calendar_date
                                    .get(Calendar.YEAR),
                            getMonthFullName(calendar_date.get(Calendar.MONTH)),
                            getMonthShortName(calendar_date.get(Calendar.MONTH)),
                            calendar_date.get(Calendar.MONTH), calendar_date
                                    .get(Calendar.DAY_OF_MONTH),
                            getWeekDayFullName(calendar_date
                                    .get(Calendar.DAY_OF_WEEK)),
                            getWeekDayShortName(calendar_date
                                    .get(Calendar.DAY_OF_WEEK)), calendar_date
                                    .get(Calendar.HOUR_OF_DAY),
                            getHourIn12Format(calendar_date
                                    .get(Calendar.HOUR_OF_DAY)), calendar_date
                                    .get(Calendar.MINUTE), calendar_date
                                    .get(Calendar.SECOND), getAMPM(calendar_date));
                
                if (dialog.isShowing() && isAutoDismiss)
                    dialog.dismiss();
                break;

            case CANCEL:
                if (iCustomDateTimeListener != null)
                    iCustomDateTimeListener.onCancel();
                if (dialog.isShowing())
                    dialog.dismiss();
                break;
        
    

    /**
     * @param date
     *            date in String
     * @param fromFormat
     *            format of your <b>date</b> eg: if your date is 2011-07-07
     *            09:09:09 then your format will be <b>yyyy-MM-dd hh:mm:ss</b>
     * @param toFormat
     *            format to which you want to convert your <b>date</b> eg: if
     *            required format is 31 July 2011 then the toFormat should be
     *            <b>d MMMM yyyy</b>
     * @return formatted date
     */
    public static String convertDate(String date, String fromFormat,
                                     String toFormat) 
        try 
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(fromFormat);
            Date d = simpleDateFormat.parse(date);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(d);

            simpleDateFormat = new SimpleDateFormat(toFormat);
            simpleDateFormat.setCalendar(calendar);
            date = simpleDateFormat.format(calendar.getTime());

         catch (Exception e) 
            e.printStackTrace();
        

        return date;
    

    private String getMonthFullName(int monthNumber) 
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.MONTH, monthNumber);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMMM");
        simpleDateFormat.setCalendar(calendar);
        String monthName = simpleDateFormat.format(calendar.getTime());

        return monthName;
    

    private String getMonthShortName(int monthNumber) 
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.MONTH, monthNumber);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM");
        simpleDateFormat.setCalendar(calendar);
        String monthName = simpleDateFormat.format(calendar.getTime());

        return monthName;
    

    private String getWeekDayFullName(int weekDayNumber) 
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_WEEK, weekDayNumber);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");
        simpleDateFormat.setCalendar(calendar);
        String weekName = simpleDateFormat.format(calendar.getTime());

        return weekName;
    

    private String getWeekDayShortName(int weekDayNumber) 
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_WEEK, weekDayNumber);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EE");
        simpleDateFormat.setCalendar(calendar);
        String weekName = simpleDateFormat.format(calendar.getTime());

        return weekName;
    

    private int getHourIn12Format(int hour24) 
        int hourIn12Format = 0;

        if (hour24 == 0)
            hourIn12Format = 12;
        else if (hour24 <= 12)
            hourIn12Format = hour24;
        else
            hourIn12Format = hour24 - 12;

        return hourIn12Format;
    

    private String getAMPM(Calendar calendar) 
        String ampm = (calendar.get(Calendar.AM_PM) == (Calendar.AM)) ? "AM"
                : "PM";
        return ampm;
    

    private void resetData() 
        calendar_date = null;
        is24HourView = true;
    

    public static String pad(int integerToPad) 
        if (integerToPad >= 10 || integerToPad < 0)
            return String.valueOf(integerToPad);
        else
            return "0" + String.valueOf(integerToPad);
    

在您的活动中:

MainActivity.java:

    public class MainActivity extends Activity

     CustomDateTimePicker custom;
Button btnEventDateTime;
        @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
    btnEventDateTime = ((Button) findViewById(R.id.btnEventDateTime));
    custom = new CustomDateTimePicker(this,
                    new CustomDateTimePicker.ICustomDateTimeListener() 

                        @Override
                        public void onSet(Dialog dialog, Calendar calendarSelected,
                                          Date dateSelected, int year, String monthFullName,
                                          String monthShortName, int monthNumber, int day,
                                          String weekDayFullName, String weekDayShortName,
                                          int hour24, int hour12, int min, int sec,
                                          String AM_PM) 
    //                        ((TextInputEditText) findViewById(R.id.edtEventDateTime))
                            edtEventDateTime.setText("");
                            edtEventDateTime.setText(year
                                    + "-" + (monthNumber + 1) + "-" + calendarSelected.get(Calendar.DAY_OF_MONTH)
                                    + " " + hour24 + ":" + min
                                    + ":" + sec);
                        

                        @Override
                        public void onCancel() 

                        
                    );
            /**
             * Pass Directly current time format it will return AM and PM if you set
             * false
             */
            custom.set24HourFormat(true);
            /**
             * Pass Directly current data and time to show when it pop up
             */
            custom.setDate(Calendar.getInstance());
            btnEventDateTime.setOnClickListener(
                    new View.OnClickListener() 

                        @Override
                        public void onClick(View v) 
                            custom.showDialog();
                        
                    );
    
    

【讨论】:

但它显示为粉红色,我在哪里可以更改颜色,或者设置主题请帮助。 @AnuragShrivastava 现在您也可以更改颜色,您必须在 DialogTheme 中进行更改。看到这个链接:***.com/a/50042997/3994127 正是我想要的,但是当我尝试使用日期setDate 时,分钟仍然是当前时间分钟。知道为什么吗? @AlexLordMordor 你能详细说明一下吗? 我注意到,您的回答使用默认或首次建立的日期和时间使用当前打开对话框,您的班级具有使用Date 值设置日期和时间的功能,但是!这很好用,除了分钟,分钟仍然是当前的或默认的。我做了一个小技巧,添加了一个使用setDate 函数初始化的日期变量hacked_date,而不是在showDialog() 中执行timePicker.setCurrentMinute(selectedMinute);,我使用了timePicker.setCurrentMinute(hacked_date.getMinutes());... 似乎是日历中的一个错误。分钟值【参考方案2】:

如果您需要在选择日期后立即选择时间,您只需在选择日期后自动显示TimePickerDialog。这是最简单的方法。

虽然您有在选择日期时触发的侦听器,但您可以简单地将所选日期传递给 TimePickerDialog 并在 mdtp_time_picker_dialog.xml 中进行一些自定义,您可以添加 TextView 以显示所选文本.

另一个选项是合并 mdtp_time_picker_dialog.xmlmdtp_date_picker_dialog.xml,它们是日期选择器对话框和时间选择器对话框的根布局。您可以将时间选择器部件可见性设置为GONE,并在需要切换选择器时切换可见性。

第二种解决方案更难实现,因为除了布局之外,您还必须合并所有控件和侦听器。

如果您希望用户看到这两个选择器,我认为您实际上需要自己设计一个新视图。那个库布局不适合这个。

【讨论】:

【参考方案3】:

您可以在DatePicker 设置日期后调用TimePicker。像这样..

    String date_time = "";
    int mYear;
    int mMonth;
    int mDay;

    int mHour;
    int mMinute;

    et_show_date_time = (EditText) findViewById(R.id.et_show_date_time);
    btn_set_date_time = (Button) findViewById(R.id.btn_set_date_time);

    btn_set_date_time.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v) 
            datePicker();

        
    );

日期选择器:

    private void datePicker()

    // Get Current Date
    final Calendar c = Calendar.getInstance();
    mYear = c.get(Calendar.YEAR);
    mMonth = c.get(Calendar.MONTH);
    mDay = c.get(Calendar.DAY_OF_MONTH);

    DatePickerDialog datePickerDialog = new DatePickerDialog(this,
            new DatePickerDialog.OnDateSetListener() 

                @Override
                public void onDateSet(DatePicker view, int year,int monthOfYear, int dayOfMonth) 

                    date_time = dayOfMonth + "-" + (monthOfYear + 1) + "-" + year;
                   //*************Call Time Picker Here ********************
                   tiemPicker();
                
            , mYear, mMonth, mDay);
       datePickerDialog.show();
    

时间选择器

 private void tiemPicker()
    // Get Current Time
    final Calendar c = Calendar.getInstance();
    mHour = c.get(Calendar.HOUR_OF_DAY);
    mMinute = c.get(Calendar.MINUTE);

    // Launch Time Picker Dialog
    TimePickerDialog timePickerDialog = new TimePickerDialog(this,
            new TimePickerDialog.OnTimeSetListener() 

                @Override
                public void onTimeSet(TimePicker view, int hourOfDay,int minute) 

                    mHour = hourOfDay;
                    mMinute = minute;

                    et_show_date_time.setText(date_time+" "+hourOfDay + ":" + minute);
                
            , mHour, mMinute, false);
    timePickerDialog.show();

--

【讨论】:

你测试过这段代码吗?这似乎对我不起作用。选择日期后,它不会调用时间选择器。【参考方案4】:

用谷歌搜索这个问题,发现有用的 Enamul Haque 的答案。稍微修改了他的代码并得到了这个结果。它的快速解决方案,将得到改进,但效果很好)

public class DateTimePicker 

    @NonNull
    private final Calendar calendar = Calendar.getInstance();
    @Nullable
    private DatePickerDialog datePickerDialog;
    @Nullable
    private TimePickerDialog timePickerDialog;
    @Nullable
    private ResultCallback<Date> dateResultCallback;

    public void showDialog(@NonNull Context context, long time) 
        calendar.setTimeInMillis(time);
        closeDialogs();
        showDatePicker(context);
    

    @Nullable
    public ResultCallback<Date> getDateResultCallback() 
        return dateResultCallback;
    

    public void setDateResultCallback(@Nullable ResultCallback<Date> dateResultCallback) 
        this.dateResultCallback = dateResultCallback;
    

    public long getTime() 
        return calendar.getTimeInMillis();
    

    private void closeDialogs() 
        if (datePickerDialog != null) 
            datePickerDialog.dismiss();
            datePickerDialog = null;
        
        if (timePickerDialog != null) 
            timePickerDialog.dismiss();
            timePickerDialog = null;
        
    

    private DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() 
        @Override
        public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) 
            calendar.set(Calendar.YEAR, year);
            calendar.set(Calendar.MONTH, month);
            calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
            timePicker(view.getContext());
        
    ;

    private TimePickerDialog.OnTimeSetListener timeSetListener = new TimePickerDialog.OnTimeSetListener() 

        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) 
            calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
            calendar.set(Calendar.MINUTE, minute);
            if (dateResultCallback != null) 
                dateResultCallback.onResult(calendar.getTime());
            
        
    ;

    private void showDatePicker(@NonNull Context context) 
        datePickerDialog = new DatePickerDialog(context,
                dateSetListener,
                calendar.get(Calendar.YEAR),
                calendar.get(Calendar.MONTH),
                calendar.get(Calendar.DAY_OF_MONTH));
        datePickerDialog.show();
    

    private void timePicker(@NonNull Context context) 
        timePickerDialog = new TimePickerDialog(context,
                timeSetListener,
                calendar.get(Calendar.HOUR_OF_DAY),
                calendar.get(Calendar.MINUTE),
                true);
        timePickerDialog.show();
    

    public void release() 
        closeDialogs();
        dateResultCallback = null;
    


Dialogs 通过方法 showDialog(...) 调用,可以在不再需要时释放对象(在活动 f.e 中的 onDestroy() 中)。 再次感谢 Enamul Haque 的想法。

【讨论】:

ResultCallback dateResultCallback 来自我的项目public interface ResultCallback&lt;Result&gt; void onResult(@Nullable Result result); 的简单接口 嗨 Ruslan,如何防止在此编码 sn-p 中输入以前的日期和时间 Umasankar,你可以设置 datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);或类似的东西【参考方案5】:

使用这个简单的代码..我在我的项目中使用这个代码..

final Calendar currentDate = Calendar.getInstance();
date = Calendar.getInstance();
            DatePickerDialog datePickerDialog = new DatePickerDialog(getContext(), new DatePickerDialog.OnDateSetListener() 

                @Override
                public void onDateSet(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) 

                    date.set(year, monthOfYear, dayOfMonth);
                    new TimePickerDialog(getContext(), new TimePickerDialog.OnTimeSetListener() 
                        @Override
                        public void onTimeSet(TimePicker view, int hourOfDay, int minute) 
                            date.set(Calendar.HOUR_OF_DAY, hourOfDay);
                            date.set(Calendar.MINUTE, minute);
                            // Log.v(TAG, "The choosen one " + date.getTime());
                            // Toast.makeText(getContext(),"The choosen one " + date.getTime(),Toast.LENGTH_SHORT).show();
                            datetime.setText(new SimpleDateFormat("dd-MMM-yyyy h:mm a").format(date.getTime()));
                        
                    ,currentDate.get(Calendar.HOUR_OF_DAY), currentDate.get(Calendar.MINUTE), false).show();

                
            , currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH), currentDate.get(Calendar.DATE));
            datePickerDialog.getDatePicker().setMinDate(currentDate.getTimeInMillis());
            datePickerDialog.show();

【讨论】:

代码出错:无法添加窗口 -- 令牌 null 不适用于应用程序【参考方案6】:

这个答案基本上是@Mayur Patel给出的答案的改进:https://***.com/a/38604615/3994127

CustomDateTimePicker.java

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.widget.AppCompatButton;
import android.view.View;
import android.view.Window;
import android.widget.DatePicker;
import android.widget.TimePicker;
import android.widget.ViewSwitcher;

import com.gotrack.gotrack.R;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

public class CustomDateTimePicker implements View.OnClickListener 
    private Calendar calendar_date = null;
    private ViewSwitcher viewSwitcher;
    private DatePicker datePicker;
    private TimePicker timePicker;
    private AppCompatButton btnDate, btnTime;

    private ICustomDateTimeListener iCustomDateTimeListener = null;

    private Dialog dialog;

    private boolean is24HourView = true, isAutoDismiss = true;

    private int selectedHour, selectedMinute;

    public CustomDateTimePicker(Context context,
                                ICustomDateTimeListener customDateTimeListener) 
        iCustomDateTimeListener = customDateTimeListener;

        dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.date_time_picker);
        dialog.setOnDismissListener(new DialogInterface.OnDismissListener() 
            @Override
            public void onDismiss(DialogInterface dialog) 
                resetData();
            
        );
    

    private void setView() 
        btnDate = dialog.findViewById(R.id.btn_date);
        btnTime = dialog.findViewById(R.id.btn_time);
        dialog.findViewById(R.id.btn_set).setOnClickListener(this);
        dialog.findViewById(R.id.btn_cancel).setOnClickListener(this);
        viewSwitcher = dialog.findViewById(R.id.view_switcher);
        datePicker = dialog.findViewById(R.id.date_picker);
        timePicker = dialog.findViewById(R.id.time_picker);

        btnDate.setOnClickListener(this);
        btnTime.setOnClickListener(this);

        timePicker.setIs24HourView(is24HourView);
        timePicker.setCurrentHour(selectedHour);
        timePicker.setCurrentMinute(selectedMinute);

        datePicker.updateDate(calendar_date.get(Calendar.YEAR),
                calendar_date.get(Calendar.MONTH),
                calendar_date.get(Calendar.DATE));

        btnDate.performClick();
    

    public void showDialog() 
        if (!dialog.isShowing()) 
            if (calendar_date == null)
                calendar_date = Calendar.getInstance();

            selectedHour = calendar_date.get(Calendar.HOUR_OF_DAY);
            selectedMinute = calendar_date.get(Calendar.MINUTE);

            dialog.show();

            setView();
        
    

    public CustomDateTimePicker setAutoDismiss(boolean isAutoDismiss) 
        this.isAutoDismiss = isAutoDismiss;
        return this;
    

    public CustomDateTimePicker dismissDialog() 
        if (!dialog.isShowing())
            dialog.dismiss();

        return this;
    

    public CustomDateTimePicker setDate(Calendar calendar) 
        if (calendar != null)
            calendar_date = calendar;
        return this;
    

    public CustomDateTimePicker setDate(Date date) 
        if (date != null) 
            calendar_date = Calendar.getInstance();
            calendar_date.setTime(date);
        
        return this;
    

    public CustomDateTimePicker setDate(int year, int month, int day) 
        if (month < 12 && month >= 0 && day < 32 && day >= 0 && year > 100
                && year < 3000) 
            calendar_date = Calendar.getInstance();
            calendar_date.set(year, month, day);
        
        return this;
    

    public CustomDateTimePicker setTimeIn24HourFormat(int hourIn24Format, int minute) 
        if (hourIn24Format < 24 && hourIn24Format >= 0 && minute >= 0
                && minute < 60) 
            if (calendar_date == null)
                calendar_date = Calendar.getInstance();

            calendar_date.set(calendar_date.get(Calendar.YEAR),
                    calendar_date.get(Calendar.MONTH),
                    calendar_date.get(Calendar.DAY_OF_MONTH), hourIn24Format,
                    minute);

            is24HourView = true;
        
        return this;
    

    public CustomDateTimePicker setTimeIn12HourFormat(int hourIn12Format, int minute,
                                                      boolean isAM) 
        if (hourIn12Format < 13 && hourIn12Format > 0 && minute >= 0
                && minute < 60) 
            if (hourIn12Format == 12)
                hourIn12Format = 0;

            int hourIn24Format = hourIn12Format;

            if (!isAM)
                hourIn24Format += 12;

            if (calendar_date == null)
                calendar_date = Calendar.getInstance();

            calendar_date.set(calendar_date.get(Calendar.YEAR),
                    calendar_date.get(Calendar.MONTH),
                    calendar_date.get(Calendar.DAY_OF_MONTH), hourIn24Format,
                    minute);

            is24HourView = false;
        
        return this;
    

    public CustomDateTimePicker set24HourFormat(boolean is24HourFormat) 
        is24HourView = is24HourFormat;
        return this;
    

    public interface ICustomDateTimeListener 
        void onSet(Dialog dialog, Calendar calendarSelected,
                   Date dateSelected, int year, String monthFullName,
                   String monthShortName, int monthNumber, int day,
                   String weekDayFullName, String weekDayShortName, int hour24,
                   int hour12, int min, int sec, String AM_PM);

        void onCancel();
    

    @Override
    public void onClick(View v) 
        switch (v.getId()) 
            case R.id.btn_date:
                btnTime.setEnabled(true);
                btnDate.setEnabled(false);

                if (viewSwitcher.getCurrentView() != datePicker) 
                    viewSwitcher.showPrevious();
                
                break;

            case R.id.btn_time:
                btnTime.setEnabled(false);
                btnDate.setEnabled(true);
                if (viewSwitcher.getCurrentView() == datePicker) 
                    viewSwitcher.showNext();
                
                break;


            case R.id.btn_set:
                if (iCustomDateTimeListener != null) 
                    int month = datePicker.getMonth();
                    int year = datePicker.getYear();
                    int day = datePicker.getDayOfMonth();
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
                    selectedHour = timePicker.getHour();
                    selectedMinute = timePicker.getMinute();
                 else 
                    selectedHour = timePicker.getCurrentHour();
                    selectedMinute = timePicker.getCurrentMinute();
                

                    calendar_date.set(year, month, day, selectedHour,
                            selectedMinute);

                    iCustomDateTimeListener.onSet(dialog, calendar_date,
                            calendar_date.getTime(), calendar_date
                                    .get(Calendar.YEAR),
                            getMonthFullName(calendar_date.get(Calendar.MONTH)),
                            getMonthShortName(calendar_date.get(Calendar.MONTH)),
                            calendar_date.get(Calendar.MONTH), calendar_date
                                    .get(Calendar.DAY_OF_MONTH),
                            getWeekDayFullName(calendar_date
                                    .get(Calendar.DAY_OF_WEEK)),
                            getWeekDayShortName(calendar_date
                                    .get(Calendar.DAY_OF_WEEK)), calendar_date
                                    .get(Calendar.HOUR_OF_DAY),
                            getHourIn12Format(calendar_date
                                    .get(Calendar.HOUR_OF_DAY)), calendar_date
                                    .get(Calendar.MINUTE), calendar_date
                                    .get(Calendar.SECOND), getAMPM(calendar_date));
                
                if (dialog.isShowing() && isAutoDismiss)
                    dialog.dismiss();
                break;

            case R.id.btn_cancel:
                if (iCustomDateTimeListener != null)
                    iCustomDateTimeListener.onCancel();
                if (dialog.isShowing())
                    dialog.dismiss();
                break;
        
    

    /**
     * @param date       date in String
     * @param fromFormat format of your <b>date</b> eg: if your date is 2011-07-07
     *                   09:09:09 then your format will be <b>yyyy-MM-dd hh:mm:ss</b>
     * @param toFormat   format to which you want to convert your <b>date</b> eg: if
     *                   required format is 31 July 2011 then the toFormat should be
     *                   <b>d MMMM yyyy</b>
     * @return formatted date
     */
    public static String convertDate(String date, String fromFormat,
                                     String toFormat) 
        try 
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(fromFormat, Locale.getDefault());
            Date d = simpleDateFormat.parse(date);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(d);

            simpleDateFormat = new SimpleDateFormat(toFormat, Locale.getDefault());
            simpleDateFormat.setCalendar(calendar);
            date = simpleDateFormat.format(calendar.getTime());

         catch (Exception e) 
            e.printStackTrace();
        

        return date;
    

    private String getMonthFullName(int monthNumber) 
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.MONTH, monthNumber);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMMM", Locale.getDefault());
        simpleDateFormat.setCalendar(calendar);

        return simpleDateFormat.format(calendar.getTime());
    

    private String getMonthShortName(int monthNumber) 
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.MONTH, monthNumber);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM", Locale.getDefault());
        simpleDateFormat.setCalendar(calendar);

        return simpleDateFormat.format(calendar.getTime());
    

    private String getWeekDayFullName(int weekDayNumber) 
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_WEEK, weekDayNumber);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE", Locale.getDefault());
        simpleDateFormat.setCalendar(calendar);

        return simpleDateFormat.format(calendar.getTime());
    

    private String getWeekDayShortName(int weekDayNumber) 
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_WEEK, weekDayNumber);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EE", Locale.getDefault());
        simpleDateFormat.setCalendar(calendar);

        return simpleDateFormat.format(calendar.getTime());
    

    private int getHourIn12Format(int hour24) 
        int hourIn12Format = 0;

        if (hour24 == 0)
            hourIn12Format = 12;
        else if (hour24 <= 12)
            hourIn12Format = hour24;
        else
            hourIn12Format = hour24 - 12;

        return hourIn12Format;
    

    private String getAMPM(Calendar calendar) 
        return (calendar.get(Calendar.AM_PM) == (Calendar.AM)) ? "AM"
                : "PM";
    

    private CustomDateTimePicker resetData() 
        calendar_date = null;
        is24HourView = true;
        return this;
    

    public static String pad(int integerToPad) 
        if (integerToPad >= 10 || integerToPad < 0)
            return String.valueOf(integerToPad);
        else
            return "0" + String.valueOf(integerToPad);
    

date_time_picker.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_
    android:layout_>

    <android.support.constraint.ConstraintLayout
        android:layout_
        android:layout_
        android:padding="15dp">

        <android.support.v7.widget.AppCompatButton
            android:id="@+id/btn_date"
            android:layout_
            android:layout_
            android:layout_marginEnd="5dp"
            android:text="@string/set_date"
            app:backgroundTint="@color/colorPrimary"
            app:layout_constraintEnd_toStartOf="@+id/btn_time"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <android.support.v7.widget.AppCompatButton
            android:id="@+id/btn_time"
            android:layout_
            android:layout_
            android:layout_marginStart="5dp"
            android:text="@string/set_time"
            app:backgroundTint="@color/colorPrimary"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/btn_date"
            app:layout_constraintTop_toTopOf="parent" />

        <android.support.v7.widget.AppCompatButton
            android:id="@+id/btn_set"
            android:layout_
            android:layout_
            android:layout_marginEnd="5dp"
            android:text="@string/set"
            app:backgroundTint="@color/colorPrimary"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/btn_cancel"
            app:layout_constraintStart_toStartOf="parent" />

        <android.support.v7.widget.AppCompatButton
            android:id="@+id/btn_cancel"
            android:layout_
            android:layout_
            android:layout_marginStart="5dp"
            android:text="@string/cancel"
            app:backgroundTint="@color/colorPrimary"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/btn_set" />

        <ViewSwitcher
            android:id="@+id/view_switcher"
            android:layout_
            android:layout_
            app:layout_constraintBottom_toTopOf="@+id/btn_set"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/btn_date">

            <DatePicker
                android:id="@+id/date_picker"
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:theme="@style/DialogTheme" />

            <TimePicker
                android:id="@+id/time_picker"
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:theme="@style/DialogTheme" />
        </ViewSwitcher>
    </android.support.constraint.ConstraintLayout>
</RelativeLayout>

DialogTheme 风格

<style name="DialogTheme">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
</style>

调用代码

new CustomDateTimePicker(context,
        new CustomDateTimePicker.ICustomDateTimeListener() 
            @Override
            public void onSet(Dialog dialog, Calendar calendarSelected,
                              Date dateSelected, int year,
                              String monthFullName,
                              String monthShortName,
                              int monthNumber, int date,
                              String weekDayFullName,
                              String weekDayShortName, int hour24,
                              int hour12,
                              int min, int sec, String AM_PM) 

            

            @Override
            public void onCancel() 

            
        ).set24HourFormat(true).setDate(Calendar.getInstance())
        .showDialog();

【讨论】:

【参考方案7】:

您可以在 Android 中使用Pickers 一个一个地获取DateTime

Calendar getDate = Calendar.getInstance();

         cDay = getDate.get(Calendar.DAY_OF_MONTH);
         cMonth = getDate.get(Calendar.MONTH);
         cYear = getDate.get(Calendar.YEAR);

         timePickerDialog = new TimePickerDialog(DesignActivity.this, new TimePickerDialog.OnTimeSetListener() 
            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) 

                final String AM_PM ;

                if (hourOfDay > 12) 
                    hourOfDay -= 12;
                    AM_PM = "pm";
                 else if (hourOfDay == 0) 
                    hourOfDay += 12;
                    AM_PM = "am";
                 else if (hourOfDay == 12)
                    AM_PM = "pm";
                else
                    AM_PM = "am";

                hour1 = hourOfDay;
                minutes1 = minute;

                DatePickerDialog datePicker = new DatePickerDialog(DesignActivity.this, new DatePickerDialog.OnDateSetListener() 
                    @Override
                    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) 

                        cYear = year;
                        cMonth = month;
                        cDay = dayOfMonth;

                        editText.setText(hour1 + ":" +minutes1 + AM_PM  + "     " + cDay + "/" + cMonth + "/" + cYear);

                    
                ,cYear,cMonth,cDay);

                datePicker.show();

            
        ,hour1,minutes1,false);

        timePickerDialog.show();

    
);

如果您需要更多关于 Click This.

【讨论】:

【参考方案8】:

科特林

这是将 DatePickerDialogTimePickerDialog 组合在一起的经过测试的 Kotlin 代码。由于 Kotlin 中对闭包的支持,它变得更简单。以下函数应放在您的FragmentActivity 中。 requireContext() 方法是 Fragment 的成员。如果您使用的是Activity,请改用applicationContext

private fun pickDateTime() 
    val currentDateTime = Calendar.getInstance()
    val startYear = currentDateTime.get(Calendar.YEAR)
    val startMonth = currentDateTime.get(Calendar.MONTH)
    val startDay = currentDateTime.get(Calendar.DAY_OF_MONTH)
    val startHour = currentDateTime.get(Calendar.HOUR_OF_DAY)
    val startMinute = currentDateTime.get(Calendar.MINUTE)

    DatePickerDialog(requireContext(), DatePickerDialog.OnDateSetListener  _, year, month, day ->
        TimePickerDialog(requireContext(), TimePickerDialog.OnTimeSetListener  _, hour, minute ->
            val pickedDateTime = Calendar.getInstance()
            pickedDateTime.set(year, month, day, hour, minute)
            doSomethingWith(pickedDateTime)
        , startHour, startMinute, false).show()
    , startYear, startMonth, startDay).show()

在您的按钮的onClickListener 中调用上述函数,如下所示:

button.setOnClickListener  pickDateTime() 

就是这样!

如果您想根据用户的设置以 12 小时或 24 小时格式显示时钟,请将 false 替换为 DateFormat.is24HourFormat(requireContext())

【讨论】:

【参考方案9】:

基于@Yogesh Umesh Vaity's answer,我制作了一个用于在 Kotlin 中显示 DateTimePicker 的对象。

class DateTimePicker(val context: Context, var pickTime:Boolean = false, var calendar: Calendar = Calendar.getInstance(),
                     var callback: (it : DateTimePicker) -> Unit) 

    companion object
        @JvmStatic
        fun getFormat(format : String) : String
            when(format)
                "d" -> return "dd/MM/yyyy"
                "t" -> return "HH:mm"
                "dt" -> return "dd/MM/yyyy HH:mm"
            
            return "dd/MM/yyyy"
        
    

    fun show()
        val startYear = calendar.get(Calendar.YEAR)
        val startMonth = calendar.get(Calendar.MONTH)
        val startDay = calendar.get(Calendar.DAY_OF_MONTH)
        val startHour = calendar.get(Calendar.HOUR_OF_DAY)
        val startMinute = calendar.get(Calendar.MINUTE)

        DatePickerDialog(context, DatePickerDialog.OnDateSetListener  _, year, month, day ->
            if(pickTime) 
                TimePickerDialog(context, TimePickerDialog.OnTimeSetListener  _, hour, minute ->
                    calendar.set(year, month, day, hour, minute)
                    callback(this)
                , startHour, startMinute, true).show()
             else 
                calendar.set(year,month,day)
                callback(this)
            
        , startYear, startMonth, startDay).show()
    

    fun showTime()
        val startYear = calendar.get(Calendar.YEAR)
        val startMonth = calendar.get(Calendar.MONTH)
        val startDay = calendar.get(Calendar.DAY_OF_MONTH)
        val startHour = calendar.get(Calendar.HOUR_OF_DAY)
        val startMinute = calendar.get(Calendar.MINUTE)

        TimePickerDialog(context, TimePickerDialog.OnTimeSetListener  _, hour, minute ->
            calendar.set(startYear, startMonth, startDay, hour, minute)
            callback(this)
        , startHour, startMinute, true).show()
    

您可以像这样使用 Activity 中的对象:

// Open Date Picker only and set an EditText
DateTimePicker(this)
    val sdf = SimpleDateFormat(DateTimePicker.getFormat("d"), Locale.getDefault())
    editText.setText(sdf.format(it.calendar.time))
.show()

// Open Date Picker then Time picker and set an EditText
DateTimePicker(this, true)
    val sdf = SimpleDateFormat(DateTimePicker.getFormat("dt"), Locale.getDefault())
    editText.setText(sdf.format(it.calendar.time))
.show()

// Open Time Picker only and set an EditText
DateTimePicker(this)
    val sdf = SimpleDateFormat(DateTimePicker.getFormat("t"), Locale.getDefault())
    editText.setText(sdf.format(it.calendar.time))
.showTime()

// Use your own calendar object if you prefer to use your pre-configured calendar
val myCalendar = Calendar.getInstance()
myCalendar.set(Calendar.YEAR, 1995)
DateTimePicker(this, false, myCalendar)
    val sdf = SimpleDateFormat(DateTimePicker.getFormat("d"), Locale.getDefault())
    editText.setText(sdf.format(it.calendar.time))
.show()

【讨论】:

以上是关于一个对话框中的 Android 日期时间选择器的主要内容,如果未能解决你的问题,请参考以下文章

Android:时间选择器和日期选择器在同一个对话框中

仅包含日期和月份的Android日期选择器

如何创建新的“圆形”日期选择器 android 对话框

android-时间选择器和日期选择器

日期选择器和时间选择器的问题

如何在 android 的 datepicker 对话框中设置最大日期?