一、效果图

本文提供了 Android 自带日期选择器(DatePicker和DatePickerDialog)、时间选择器(TimePicker和TimePickerDialog)的简单使用方法, 完整代码收录在GitHup项目中,

地址: https://github.com/GinGod/BasisDependency ,相关类 BasisTimesUtils.java 和 DateTimePickerActivity.java ,

因使用比较简单, 本文只是给出效果图和工具类代码,具体逻辑可自行参考注释理解。

具体效果图如下:

1、年月日选择器

Android 自带日期(DatePicker)和时间(TimePicker)选择器使用_第1张图片

2.年月选择器

Android 自带日期(DatePicker)和时间(TimePicker)选择器使用_第2张图片

3、月日选择器

Android 自带日期(DatePicker)和时间(TimePicker)选择器使用_第3张图片

4、时间选择器

Android 自带日期(DatePicker)和时间(TimePicker)选择器使用_第4张图片

5、嵌套在布局中

Android 自带日期(DatePicker)和时间(TimePicker)选择器使用_第5张图片

二、使用工具类

提供了一个工具类, 里面包含了 DatePickerDialog 和 TimePickerDialog 的简单使用, 可自定义设置背景, 标题, 不显示年或日等

package com.gingold.basislibrary.utils;import android.app.AlertDialog;import android.app.DatePickerDialog;import android.app.TimePickerDialog;import android.content.Context;import android.content.DialogInterface;import android.text.TextUtils;import android.view.View;import android.view.ViewGroup;import android.widget.DatePicker;import android.widget.NumberPicker;import android.widget.TimePicker;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;/** * time 工具类 */public class BasisTimesUtils {    public static int THEME_DEVICE_DEFAULT_LIGHT = AlertDialog.THEME_DEVICE_DEFAULT_LIGHT;    public static int THEME_DEVICE_DEFAULT_DARK = AlertDialog.THEME_DEVICE_DEFAULT_DARK;    public static int THEME_TRADITIONAL = AlertDialog.THEME_TRADITIONAL;    public static int THEME_HOLO_LIGHT = AlertDialog.THEME_HOLO_LIGHT;    public static int THEME_HOLO_DARK = AlertDialog.THEME_HOLO_DARK;    private static DatePickerDialog mDatePickerDialog;//日期选择器    /**     * 将字符串时间转为Long时间     *     * @param time yyyy-MM-dd HH:mm:ss:SSS     */    public static Long getLongTimeOfSSS(String time) {        try {            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");            Date date = sdf.parse(time);            return date.getTime();        } catch (Exception e) {        }        return 0L;    }    /**     * 将字符串时间转为Long时间     *     * @param time yyyy-MM-dd HH:mm:ss     */    public static Long getLongTime(String time) {        try {            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");            Date date = sdf.parse(time);            return date.getTime();        } catch (Exception e) {        }        return 0L;    }    /**     * 将字符串时间转为Long时间     *     * @param time yyyy-MM-dd     */    public static Long getLongTimeOfYMD(String time) {        try {            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");            Date date = sdf.parse(time);            return date.getTime();        } catch (Exception e) {        }        return 0L;    }    /**     * 将Long时间转成String时间     *     * @return yyyy-MM-dd HH:mm:ss:SSS     */    public static String getStringTimeOfSSS(Long time) {        Date date = new Date(time);        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");        return sdf.format(date);    }    /**     * 将Long时间转成String时间     *     * @return yyyy-MM-dd HH:mm:ss     */    public static String getStringTime(Long time) {        Date date = new Date(time);        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        return sdf.format(date);    }    /**     * 将Long时间转成String时间     *     * @return yyyy-MM-dd     */    public static String getStringTimeOfYMD(Long time) {        Date date = new Date(time);        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");        return sdf.format(date);    }    /**     * 当前的时间(设备)     *     * @return yyyy-MM-dd HH:mm:ss:SSS     */    public static String getDeviceTimeOfSSS() {        String date = "";        try {            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");            date = df.format(new Date());        } catch (Exception e) {            e.printStackTrace();            date = new Date().getTime() + "";//当前时间的long字符串        }        return date;    }    /**     * 当前的时间(设备)     *     * @return yyyy-MM-dd HH:mm:ss     */    public static String getDeviceTime() {        String date = "";        try {            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");            date = df.format(new Date());        } catch (Exception e) {            e.printStackTrace();            date = new Date().getTime() + "";//当前时间的long字符串        }        return date;    }    /**     * 当前的时间(年月日)     *     * @return yyyy-MM-dd     */    public static String getDeviceTimeOfYMD() {        String date = "";        try {            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");            date = df.format(new Date());        } catch (Exception e) {            e.printStackTrace();        }        return date;    }    /**     * 当前的时间(年月)     *     * @return yyyy-MM     */    public static String getDeviceTimeOfYM() {        String date = "";        try {            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM");            date = df.format(new Date());        } catch (Exception e) {            e.printStackTrace();        }        return date;    }    /**     * 获取某月最后一天(年月日)     *     * @return yyyy-MM     */    public static String getLastDayOfMonthOfYMD(int year, int month) {        Calendar cal = Calendar.getInstance();        // 设置年份        cal.set(Calendar.YEAR, year);        // 设置月份        cal.set(Calendar.MONTH, month - 1);        // 获取某月最大天数        int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);        // 设置日历中月份的最大天数        cal.set(Calendar.DAY_OF_MONTH, lastDay);        // 格式化日期        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");        String lastDayOfMonth = sdf.format(cal.getTime());        return lastDayOfMonth;    }    /**     * 获取某月最后一天(日)     */    public static int getLastDayOfMonth(int year, int month) {        Calendar cal = Calendar.getInstance();        // 设置年份        cal.set(Calendar.YEAR, year);        // 设置月份        cal.set(Calendar.MONTH, month - 1);        // 获取某月最大天数        int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);        return lastDay;    }    /**     * 显示日期选择器     *     * @param themeLight true 白色背景; false 黑色背景     */    public static BasisTimesUtils showDatePickerDialog(Context context, boolean themeLight, String title, int year, int month, int day, OnDatePickerListener onDateTimePickerListener) {        int themeId = AlertDialog.THEME_HOLO_LIGHT;//默认白色背景        if (!themeLight) {            themeId = AlertDialog.THEME_HOLO_DARK;//黑色背景        }        return showDatePickerDialog(context, themeId, title, year, month, day, onDateTimePickerListener);    }    /**     * 显示日期选择器, 默认白色背景     */    public static BasisTimesUtils showDatePickerDialog(Context context, String title, int year, int month, int day, OnDatePickerListener onDateTimePickerListener) {        return showDatePickerDialog(context, AlertDialog.THEME_HOLO_LIGHT, title, year, month, day, onDateTimePickerListener);    }    /**     * 显示日期选择器     */    public static BasisTimesUtils showDatePickerDialog(Context context, int themeId, String title, int year, int month, int day,                                                        final OnDatePickerListener onDateTimePickerListener) {        mDatePickerDialog = new DatePickerDialog(context, themeId, new DatePickerDialog.OnDateSetListener() {            @Override            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {                month = month + 1;//月份加一                if (onDateTimePickerListener != null) {                    onDateTimePickerListener.onConfirm(year, month, dayOfMonth);                }            }        }, year, month - 1, day);//月份减一        mDatePickerDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {            @Override            public void onCancel(DialogInterface dialog) {                if (onDateTimePickerListener != null) {                    onDateTimePickerListener.onCancel();                }            }        });        if (!TextUtils.isEmpty(title)) {            mDatePickerDialog.setTitle(title);        }        mDatePickerDialog.show();        return new BasisTimesUtils();    }    /**     * 隐藏年, 只显示月和日     */    public void setYearGone() {        setSpecialDatePicker(1);    }    /**     * 隐藏日, 只显示年和月     */    public void setDayGone() {        setSpecialDatePicker(2);    }    private void setSpecialDatePicker(int state) {        try {            DatePicker dp = mDatePickerDialog.getDatePicker();            NumberPicker view0 = (NumberPicker) ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(0); //获取最前一位的宽度            NumberPicker view1 = (NumberPicker) ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(1); //获取中间一位的宽度            NumberPicker view2 = (NumberPicker) ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2);//获取最后一位的宽度            //年的最大值为2100            //月的最大值为11            //日的最大值为28,29,30,31            int value0 = view0.getMaxValue();//获取第一个View的最大值            int value1 = view1.getMaxValue();//获取第二个View的最大值            int value2 = view2.getMaxValue();//获取第三个View的最大值            if (state == 1) {//隐藏年, 只显示月和日                if (value0 > 252) {                    view0.setVisibility(View.GONE);                } else if (value1 > 252) {                    view1.setVisibility(View.GONE);                } else if (value2 > 252) {                    view2.setVisibility(View.GONE);                }            } else if (state == 2) {//隐藏日, 只显示年和月                if (value0 > 25 && value0 < 252) {                    view0.setVisibility(View.GONE);                } else if (value1 > 25 && value1 < 252) {                    view1.setVisibility(View.GONE);                } else if (value2 > 25 && value2 < 252) {                    view2.setVisibility(View.GONE);                }            }        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 显示时间选择器     */    public static void showTimerPickerDialog(Context context, boolean themeLight, String title, int hourOfDay, int minute, boolean is24HourView, final OnTimerPickerListener onTimerPickerListener) {        int themeId = AlertDialog.THEME_HOLO_LIGHT;//默认白色背景        if (!themeLight) {            themeId = AlertDialog.THEME_HOLO_DARK;//黑色背景        }        showTimerPickerDialog(context, themeId, title, hourOfDay, minute, is24HourView, onTimerPickerListener);    }    /**     * 显示时间选择器, 默认白色背景     */    public static void showTimerPickerDialog(Context context, String title, int hourOfDay, int minute, boolean is24HourView, final OnTimerPickerListener onTimerPickerListener) {        showTimerPickerDialog(context, AlertDialog.THEME_HOLO_LIGHT, title, hourOfDay, minute, is24HourView, onTimerPickerListener);    }    /**     * 显示时间选择器     */    public static void showTimerPickerDialog(Context context, int themeId, String title, int hourOfDay, int minute, boolean is24HourView, final OnTimerPickerListener onTimerPickerListener) {        TimePickerDialog dialog = new TimePickerDialog(context, themeId, new TimePickerDialog.OnTimeSetListener() {            @Override            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {                if (onTimerPickerListener != null) {                    onTimerPickerListener.onConfirm(hourOfDay, minute);                }            }        }, hourOfDay, minute, is24HourView);        dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {            @Override            public void onCancel(DialogInterface dialog) {                if (onTimerPickerListener != null) {                    onTimerPickerListener.onCancel();                }            }        });        if (!TextUtils.isEmpty(title)) {            dialog.setTitle(title);        }        dialog.show();    }    /**     * 日期选择器监听     */    public interface OnDatePickerListener {        void onConfirm(int year, int month, int dayOfMonth);        void onCancel();    }    /**     * 时间选择器监听     */    public interface OnTimerPickerListener {        void onConfirm(int hourOfDay, int minute);        void onCancel();    }}

三、使用方法

提供了几个简便使用的方法

/**     * 时间选择     */    private void showTimerPicker() {        BasisTimesUtils.showTimerPickerDialog(mActivity, true, "请选择时间", 21, 33, true, new BasisTimesUtils.OnTimerPickerListener() {            @Override            public void onConfirm(int hourOfDay, int minute) {                toast(hourOfDay + ":" + minute);            }            @Override            public void onCancel() {                toast("cancle");            }        });    }    /**     * 月日选择     */    private void showMonthDayPicker() {        BasisTimesUtils.showDatePickerDialog(context, false, "请选择月日", 2015, 8, 28, new BasisTimesUtils.OnDatePickerListener() {            @Override            public void onConfirm(int year, int month, int dayOfMonth) {                toast(year + "-" + month + "-" + dayOfMonth);            }            @Override            public void onCancel() {                toast("cancle");            }        }).setYearGone();    }    /**     * 年月选择     */    private void showYearMonthPicker() {        BasisTimesUtils.showDatePickerDialog(context, true, "", 2015, 12, 22,                new BasisTimesUtils.OnDatePickerListener() {                    @Override                    public void onConfirm(int year, int month, int dayOfMonth) {                        toast(year + "-" + month + "-" + dayOfMonth);                    }                    @Override                    public void onCancel() {                        toast("cancle");                    }                }).setDayGone();    }    /**     * 年月日选择     */    private void showYearMonthDayPicker() {        BasisTimesUtils.showDatePickerDialog(context, BasisTimesUtils.THEME_HOLO_DARK, "请选择年月日", 2015, 1, 1, new BasisTimesUtils.OnDatePickerListener() {            @Override            public void onConfirm(int year, int month, int dayOfMonth) {                toast(year + "-" + month + "-" + dayOfMonth);            }            @Override            public void onCancel() {                toast("cancle");            }        });    }

四、在布局中使用DatePicker和TimePicker

1、布局文件如下, 需要添加属性: android:theme="@android:style/Theme.Holo.Light"

                        

2、代码中设置变化监听

//日期选择器初始化和变化监听        dp_datetimepicker_date.init(2016, 1, 1, new DatePicker.OnDateChangedListener() {            @Override            public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {                BasisLogUtils.e("onDateChanged: " + year + "-" + monthOfYear + "-" + dayOfMonth);            }        });        //时间选择器初始化和变化监听        tp_datetimepicker_time.setIs24HourView(true);        tp_datetimepicker_time.setHour(16);        tp_datetimepicker_time.setMinute(36);        tp_datetimepicker_time.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {            @Override            public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {                BasisLogUtils.e(hourOfDay + ":" + minute);            }        });

五、总结

1、DatePicker和TimePicker是系统自带的选择器, 使用比较简单, 基本可满足对选择器没特殊要求的日常开发

2、高版本提供了新的显示方式, 可通过设置主题为 THEME_DEVICE_DEFAULT_LIGHT 和 THEME_DEVICE_DEFAULT_DARK 查看效果, 大家可自行尝试

六、关联

完整代码收录在GitHup项目中,地址: https://github.com/GinGod/BasisDependency ,相关类 BasisTimesUtils.java 和 DateTimePickerActivity.java

更多相关文章

  1. Android 为【apk】文件签名,增加修改系统时间等权限
  2. Android之背景图片设置为重复而不是默认的拉伸
  3. Android背景颜色渐变
  4. Android 背景图片重复平铺
  5. Android 日期和时间选择控件的开发
  6. Android 加快编译时间

随机推荐

  1. Android仿QQ首页ListView左滑置顶、删除
  2. Android(安卓)高通平台Camera录制--MPEG4
  3. Android(安卓)WebDAV 客户端实现
  4. android源码项目
  5. Android优秀开源项目汇总
  6. 简单学习下Android(安卓)Activity
  7. 闲来无事,分析一下淘宝千牛客户端
  8. Android ListView的addHeaderView注意事
  9. widget 常用UI控件介绍
  10. android中Uri.parse()用法