自定义Android日期时间选择控件DateTimePickerDialog

来源:互联网 发布:平台优化 编辑:程序博客网 时间:2024/05/17 17:38


        Android系统提供了DatePicker、TimePicker、DatePickerDialog、TimePickerDialog控件用于日期和时间的选择和设置,但是它们都是相对独立的,不能方便的设置“yyyy-MM-dd HH:mm:ss”型日期时间,下面是使用这几种组件自定义的一个日期时间选择控件DateTimePickerDialog,可以方便的设置“yyyy-MM-dd HH:mm:ss”型日期时间,“yyyy-MM-dd”型日期和“HH:mm:ss”型时间,如下图:

点击查看原图

代码实现:

DateTimePickerDialog.java

001package me.gogogogo.util;
002 
003import java.text.SimpleDateFormat;
004import java.util.Calendar;
005 
006import me.gogogogo.activity.R;
007import android.app.Activity;
008import android.app.AlertDialog;
009import android.app.DatePickerDialog;
010import android.app.TimePickerDialog;
011import android.content.DialogInterface;
012import android.widget.DatePicker;
013import android.widget.EditText;
014import android.widget.LinearLayout;
015import android.widget.DatePicker.OnDateChangedListener;
016import android.widget.TimePicker;
017import android.widget.TimePicker.OnTimeChangedListener;
018/**
019 * 日期时间选择控件
020 * @author 大漠
021 */
022public class DateTimePickerDialog implements  OnDateChangedListener,OnTimeChangedListener{
023    private DatePicker datePicker;
024    private TimePicker timePicker;
025    private AlertDialog ad;
026    private String dateTime;
027    private String initDateTime;
028    private Activity activity;
029     
030    /**
031     * 日期时间弹出选择框构
032     * @param activity:调用的父activity
033     */
034    public DateTimePickerDialog(Activity activity)
035    {
036        this.activity = activity;
037    }
038     
039    public void init(DatePicker datePicker,TimePicker timePicker)
040    {
041        Calendar calendar= Calendar.getInstance();
042        initDateTime=calendar.get(Calendar.YEAR)+"-"+calendar.get(Calendar.MONTH)+"-"+
043                calendar.get(Calendar.DAY_OF_MONTH)+" "+
044                calendar.get(Calendar.HOUR_OF_DAY)+":"+
045                calendar.get(Calendar.MINUTE)+
046                calendar.get(Calendar.SECOND);
047        datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH), this);
048        timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
049        timePicker.setCurrentMinute(calendar.get(Calendar.MINUTE));
050    }
051     
052    /**
053     * 弹出日期时间选择框
054     * @param dateTimeTextEdite 需要设置的日期时间文本编辑框
055     * @param type: 0为日期时间类型:yyyy-MM-dd HH:mm:ss
056     *                        1为日期类型:yyyy-MM-dd
057     *                        2为时间类型:HH:mm:ss
058     * @return
059     */
060    public AlertDialog dateTimePicKDialog(final EditText dateTimeTextEdite, int type)
061    {
062        Calendar c = Calendar.getInstance();
063        switch (type) {
064        case 1:
065            new DatePickerDialog(activity,
066                    new DatePickerDialog.OnDateSetListener() {
067                        public void onDateSet(DatePicker datePicker, int year, int monthOfYear,
068                                int dayOfMonth) {
069                            Calendar calendar = Calendar.getInstance();
070                            calendar.set(datePicker.getYear(), datePicker.getMonth(),
071                                    datePicker.getDayOfMonth());
072                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
073                            dateTime=sdf.format(calendar.getTime());
074                            dateTimeTextEdite.setText(dateTime);
075                        }
076                    },
077                    c.get(Calendar.YEAR),
078                    c.get(Calendar.MONTH),
079                    c.get(Calendar.DATE)).show();
080            return null;
081        case 2:
082            new TimePickerDialog(activity,
083                    new TimePickerDialog.OnTimeSetListener() {
084                        public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) {
085                            Calendar calendar = Calendar.getInstance();
086                            calendar.set(Calendar.YEAR, Calendar.MONTH,
087                                    Calendar.DAY_OF_MONTH, timePicker.getCurrentHour(),
088                                    timePicker.getCurrentMinute());
089                            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
090                            dateTime=sdf.format(calendar.getTime());
091                            dateTimeTextEdite.setText(dateTime);
092                        }
093                    },
094                    c.get(Calendar.HOUR_OF_DAY),
095                    c.get(Calendar.MINUTE),
096                    true).show();
097            return null;
098        default:
099            LinearLayout dateTimeLayout  = (LinearLayout) activity.getLayoutInflater().inflate(R.layout.datetime, null);
100            datePicker = (DatePicker) dateTimeLayout.findViewById(R.id.datepicker);
101            timePicker = (TimePicker) dateTimeLayout.findViewById(R.id.timepicker);
102            init(datePicker,timePicker);
103            timePicker.setIs24HourView(true);
104            timePicker.setOnTimeChangedListener(this);
105                     
106            ad = new AlertDialog.Builder(activity).setIcon(R.drawable.datetimeicon).setTitle(initDateTime).setView(dateTimeLayout).setPositiveButton("设置",
107                            new DialogInterface.OnClickListener()
108                            {
109                                public void onClick(DialogInterface dialog,
110                                        int whichButton)
111                                {
112                                    dateTimeTextEdite.setText(dateTime);
113                                }
114                            }).setNegativeButton("取消",
115                            new DialogInterface.OnClickListener()
116                            {
117                                public void onClick(DialogInterface dialog,
118                                        int whichButton)
119                                {
120                                    dateTimeTextEdite.setText("");
121                                }
122                            }).show();
123             
124            onDateChanged(null000);
125            return ad;
126        }
127    }
128     
129    public void onTimeChanged(TimePicker view, int hourOfDay, int minute)
130    {
131        onDateChanged(null000);
132    }
133 
134    public void onDateChanged(DatePicker view, int year, int monthOfYear,
135            int dayOfMonth)
136    {
137        Calendar calendar = Calendar.getInstance();
138 
139        calendar.set(datePicker.getYear(), datePicker.getMonth(),
140                datePicker.getDayOfMonth(), timePicker.getCurrentHour(),
141                timePicker.getCurrentMinute());
142        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
143        dateTime=sdf.format(calendar.getTime());
144        ad.setTitle(dateTime);
145    }
146     
147}

布局文件:

datetime.xml

01<?xml version="1.0" encoding="utf-8"?>
02<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03    android:orientation="vertical"
04    android:layout_width="fill_parent"
05    android:layout_height="fill_parent">
06    <DatePicker
07        android:id="@+id/datepicker"
08        android:layout_width="fill_parent"
09        android:layout_height="wrap_content" />
10    <TimePicker
11        android:id="@+id/timepicker"
12        android:layout_width="fill_parent"
13        android:layout_height="wrap_content" />
14</LinearLayout>

使用实例:

MainActivity.java

01package me.gogogogo.activity;
02 
03import me.gogogogo.util.DateTimePickerDialog;
04import android.os.Bundle;
05import android.view.View;
06import android.view.View.OnClickListener;
07import android.widget.EditText;
08import android.app.Activity;
09 
10public class MainActivity extends Activity {
11    private EditText date;
12    private EditText time;
13    private EditText datetime;
14    public void onCreate(Bundle savedInstanceState) {
15        super.onCreate(savedInstanceState);
16        setContentView(R.layout.main);
17         
18        datetime = (EditText) this.findViewById(R.id.datetime);
19        date = (EditText) this.findViewById(R.id.date);
20        time = (EditText) this.findViewById(R.id.time);
21         
22        datetime.setOnClickListener(new DateTimeOnClick());
23        date.setOnClickListener(new DateOnClick());
24        time.setOnClickListener(new TimeOnClick());
25    }
26     
27    private final class DateTimeOnClick implements OnClickListener{
28        public void onClick(View v) {
29            DateTimePickerDialog dateTimePicKDialog = new DateTimePickerDialog(
30                    MainActivity.this);
31            dateTimePicKDialog.dateTimePicKDialog(datetime, 0);
32        }
33    }
34     
35    private final class DateOnClick implements OnClickListener{
36        public void onClick(View v) {
37            DateTimePickerDialog dateTimePicKDialog = new DateTimePickerDialog(
38                    MainActivity.this);
39            dateTimePicKDialog.dateTimePicKDialog(date, 1);
40        }
41    }
42     
43    private final class TimeOnClick implements OnClickListener{
44        public void onClick(View v) {
45            DateTimePickerDialog dateTimePicKDialog = new DateTimePickerDialog(
46                    MainActivity.this);
47            dateTimePicKDialog.dateTimePicKDialog(time, 2);
48        }
49    }
50}

main.xml

01<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
02    xmlns:tools="http://schemas.android.com/tools"
03    android:orientation="vertical"
04    android:layout_width="fill_parent"
05    android:layout_height="fill_parent" >
06        <TextView android:text="@string/datetime"
07            android:layout_width="wrap_content"
08            android:layout_height="wrap_content"/>
09        <EditText android:id="@+id/datetime"
10            android:layout_width="fill_parent"
11            android:layout_height="wrap_content"
12            android:inputType="datetime"/>
13         
14        <TextView android:text="@string/date"
15            android:layout_width="wrap_content"
16            android:layout_height="wrap_content"/>
17        <EditText android:id="@+id/date"
18            android:layout_width="fill_parent"
19            android:layout_height="wrap_content"
20            android:inputType="date"/>
21     
22        <TextView android:text="@string/time"
23            android:layout_width="wrap_content"
24            android:layout_height="wrap_content"/>
25        <EditText android:id="@+id/time"
26            android:layout_width="fill_parent"
27            android:layout_height="wrap_content"
28            android:inputType="time"/>
29 
30</LinearLayout>

实例效果:

点击查看原图