Android自定义DataTimePicker(日期选择器)

转载:http://blog.csdn.net/wwj_748/article/details/38778631



Android自定义DataTimePicker(日期选择器)


 笔者有一段时间没有发表关于Android的文章了,关于Android自定义组件笔者有好几篇想跟大家分享的,后期会记录在博客中。本篇博客给大家分享的是自定义一个日期选择器,可以让用户同时选择年月日和当前时间。

先看看效果:
Android自定义DataTimePicker(日期选择器)_第1张图片

实现的效果就是在同一个布局上显示日期选择和时间选择。

自定义一个类:
/DateTimePicker/src/com/wwj/datetimepicker/DateTimePickDialogUtil.java
[java]  view plain copy
  1. package com.wwj.datetimepicker;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Calendar;  
  5.   
  6. import android.app.Activity;  
  7. import android.app.AlertDialog;  
  8. import android.content.DialogInterface;  
  9. import android.widget.DatePicker;  
  10. import android.widget.DatePicker.OnDateChangedListener;  
  11. import android.widget.EditText;  
  12. import android.widget.LinearLayout;  
  13. import android.widget.TimePicker;  
  14. import android.widget.TimePicker.OnTimeChangedListener;  
  15.   
  16. /** 
  17.  * 日期时间选择控件 使用方法: private EditText inputDate;//需要设置的日期时间文本编辑框 private String 
  18.  * initDateTime="2012年9月3日 14:44",//初始日期时间值 在点击事件中使用: 
  19.  * inputDate.setOnClickListener(new OnClickListener() { 
  20.  *  
  21.  * @Override public void onClick(View v) { DateTimePickDialogUtil 
  22.  *           dateTimePicKDialog=new 
  23.  *           DateTimePickDialogUtil(SinvestigateActivity.this,initDateTime); 
  24.  *           dateTimePicKDialog.dateTimePicKDialog(inputDate); 
  25.  *  
  26.  *           } }); 
  27.  *  
  28.  * @author 
  29.  */  
  30. public class DateTimePickDialogUtil implements OnDateChangedListener,  
  31.         OnTimeChangedListener {  
  32.     private DatePicker datePicker;  
  33.     private TimePicker timePicker;  
  34.     private AlertDialog ad;  
  35.     private String dateTime;  
  36.     private String initDateTime;  
  37.     private Activity activity;  
  38.   
  39.     /** 
  40.      * 日期时间弹出选择框构造函数 
  41.      *  
  42.      * @param activity 
  43.      *            :调用的父activity 
  44.      * @param initDateTime 
  45.      *            初始日期时间值,作为弹出窗口的标题和日期时间初始值 
  46.      */  
  47.     public DateTimePickDialogUtil(Activity activity, String initDateTime) {  
  48.         this.activity = activity;  
  49.         this.initDateTime = initDateTime;  
  50.   
  51.     }  
  52.   
  53.     public void init(DatePicker datePicker, TimePicker timePicker) {  
  54.         Calendar calendar = Calendar.getInstance();  
  55.         if (!(null == initDateTime || "".equals(initDateTime))) {  
  56.             calendar = this.getCalendarByInintData(initDateTime);  
  57.         } else {  
  58.             initDateTime = calendar.get(Calendar.YEAR) + "年"  
  59.                     + calendar.get(Calendar.MONTH) + "月"  
  60.                     + calendar.get(Calendar.DAY_OF_MONTH) + "日 "  
  61.                     + calendar.get(Calendar.HOUR_OF_DAY) + ":"  
  62.                     + calendar.get(Calendar.MINUTE);  
  63.         }  
  64.   
  65.         datePicker.init(calendar.get(Calendar.YEAR),  
  66.                 calendar.get(Calendar.MONTH),  
  67.                 calendar.get(Calendar.DAY_OF_MONTH), this);  
  68.         timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));  
  69.         timePicker.setCurrentMinute(calendar.get(Calendar.MINUTE));  
  70.     }  
  71.   
  72.     /** 
  73.      * 弹出日期时间选择框方法 
  74.      *  
  75.      * @param inputDate 
  76.      *            :为需要设置的日期时间文本编辑框 
  77.      * @return 
  78.      */  
  79.     public AlertDialog dateTimePicKDialog(final EditText inputDate) {  
  80.         LinearLayout dateTimeLayout = (LinearLayout) activity  
  81.                 .getLayoutInflater().inflate(R.layout.common_datetime, null);  
  82.         datePicker = (DatePicker) dateTimeLayout.findViewById(R.id.datepicker);  
  83.         timePicker = (TimePicker) dateTimeLayout.findViewById(R.id.timepicker);  
  84.         init(datePicker, timePicker);  
  85.         timePicker.setIs24HourView(true);  
  86.         timePicker.setOnTimeChangedListener(this);  
  87.   
  88.         ad = new AlertDialog.Builder(activity)  
  89.                 .setTitle(initDateTime)  
  90.                 .setView(dateTimeLayout)  
  91.                 .setPositiveButton("设置"new DialogInterface.OnClickListener() {  
  92.                     public void onClick(DialogInterface dialog, int whichButton) {  
  93.                         inputDate.setText(dateTime);  
  94.                     }  
  95.                 })  
  96.                 .setNegativeButton("取消"new DialogInterface.OnClickListener() {  
  97.                     public void onClick(DialogInterface dialog, int whichButton) {  
  98.                         inputDate.setText("");  
  99.                     }  
  100.                 }).show();  
  101.   
  102.         onDateChanged(null000);  
  103.         return ad;  
  104.     }  
  105.   
  106.     public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {  
  107.         onDateChanged(null000);  
  108.     }  
  109.   
  110.     public void onDateChanged(DatePicker view, int year, int monthOfYear,  
  111.             int dayOfMonth) {  
  112.         // 获得日历实例  
  113.         Calendar calendar = Calendar.getInstance();  
  114.   
  115.         calendar.set(datePicker.getYear(), datePicker.getMonth(),  
  116.                 datePicker.getDayOfMonth(), timePicker.getCurrentHour(),  
  117.                 timePicker.getCurrentMinute());  
  118.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");  
  119.   
  120.         dateTime = sdf.format(calendar.getTime());  
  121.         ad.setTitle(dateTime);  
  122.     }  
  123.   
  124.     /** 
  125.      * 实现将初始日期时间2012年07月02日 16:45 拆分成年 月 日 时 分 秒,并赋值给calendar 
  126.      *  
  127.      * @param initDateTime 
  128.      *            初始日期时间值 字符串型 
  129.      * @return Calendar 
  130.      */  
  131.     private Calendar getCalendarByInintData(String initDateTime) {  
  132.         Calendar calendar = Calendar.getInstance();  
  133.   
  134.         // 将初始日期时间2012年07月02日 16:45 拆分成年 月 日 时 分 秒  
  135.         String date = spliteString(initDateTime, "日""index""front"); // 日期  
  136.         String time = spliteString(initDateTime, "日""index""back"); // 时间  
  137.   
  138.         String yearStr = spliteString(date, "年""index""front"); // 年份  
  139.         String monthAndDay = spliteString(date, "年""index""back"); // 月日  
  140.   
  141.         String monthStr = spliteString(monthAndDay, "月""index""front"); // 月  
  142.         String dayStr = spliteString(monthAndDay, "月""index""back"); // 日  
  143.   
  144.         String hourStr = spliteString(time, ":""index""front"); // 时  
  145.         String minuteStr = spliteString(time, ":""index""back"); // 分  
  146.   
  147.         int currentYear = Integer.valueOf(yearStr.trim()).intValue();  
  148.         int currentMonth = Integer.valueOf(monthStr.trim()).intValue() - 1;  
  149.         int currentDay = Integer.valueOf(dayStr.trim()).intValue();  
  150.         int currentHour = Integer.valueOf(hourStr.trim()).intValue();  
  151.         int currentMinute = Integer.valueOf(minuteStr.trim()).intValue();  
  152.   
  153.         calendar.set(currentYear, currentMonth, currentDay, currentHour,  
  154.                 currentMinute);  
  155.         return calendar;  
  156.     }  
  157.   
  158.     /** 
  159.      * 截取子串 
  160.      *  
  161.      * @param srcStr 
  162.      *            源串 
  163.      * @param pattern 
  164.      *            匹配模式 
  165.      * @param indexOrLast 
  166.      * @param frontOrBack 
  167.      * @return 
  168.      */  
  169.     public static String spliteString(String srcStr, String pattern,  
  170.             String indexOrLast, String frontOrBack) {  
  171.         String result = "";  
  172.         int loc = -1;  
  173.         if (indexOrLast.equalsIgnoreCase("index")) {  
  174.             loc = srcStr.indexOf(pattern); // 取得字符串第一次出现的位置  
  175.         } else {  
  176.             loc = srcStr.lastIndexOf(pattern); // 最后一个匹配串的位置  
  177.         }  
  178.         if (frontOrBack.equalsIgnoreCase("front")) {  
  179.             if (loc != -1)  
  180.                 result = srcStr.substring(0, loc); // 截取子串  
  181.         } else {  
  182.             if (loc != -1)  
  183.                 result = srcStr.substring(loc + 1, srcStr.length()); // 截取子串  
  184.         }  
  185.         return result;  
  186.     }  
  187.   
  188. }  

/DateTimePicker/src/com/wwj/datetimepicker/DateTimePickerActivity.java
[java]  view plain copy
  1. package com.wwj.datetimepicker;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.EditText;  
  8.   
  9. /** 
  10.  * 时间拾取器界面 
  11.  *  
  12.  * @author wwj_748 
  13.  *  
  14.  */  
  15. public class DateTimePickerActivity extends Activity {  
  16.     /** Called when the activity is first created. */  
  17.     private EditText startDateTime;  
  18.     private EditText endDateTime;  
  19.   
  20.     private String initStartDateTime = "2013年9月3日 14:44"// 初始化开始时间  
  21.     private String initEndDateTime = "2014年8月23日 17:44"// 初始化结束时间  
  22.   
  23.     @Override  
  24.     public void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.main);  
  27.   
  28.         // 两个输入框  
  29.         startDateTime = (EditText) findViewById(R.id.inputDate);  
  30.         endDateTime = (EditText) findViewById(R.id.inputDate2);  
  31.   
  32.         startDateTime.setText(initStartDateTime);  
  33.         endDateTime.setText(initEndDateTime);  
  34.   
  35.         startDateTime.setOnClickListener(new OnClickListener() {  
  36.             public void onClick(View v) {  
  37.   
  38.                 DateTimePickDialogUtil dateTimePicKDialog = new DateTimePickDialogUtil(  
  39.                         DateTimePickerActivity.this, initEndDateTime);  
  40.                 dateTimePicKDialog.dateTimePicKDialog(startDateTime);  
  41.   
  42.             }  
  43.         });  
  44.   
  45.         endDateTime.setOnClickListener(new OnClickListener() {  
  46.   
  47.             public void onClick(View v) {  
  48.                 DateTimePickDialogUtil dateTimePicKDialog = new DateTimePickDialogUtil(  
  49.                         DateTimePickerActivity.this, initEndDateTime);  
  50.                 dateTimePicKDialog.dateTimePicKDialog(endDateTime);  
  51.             }  
  52.         });  
  53.     }  
  54. }  

自定义界面:
/DateTimePicker/res/layout/common_datetime.xml
[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <DatePicker  
  8.         android:id="@+id/datepicker"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:calendarViewShown="false" />  
  12.   
  13.     <TimePicker  
  14.         android:id="@+id/timepicker"  
  15.         android:layout_width="wrap_content"  
  16.         android:layout_height="wrap_content" />  
  17.   
  18. </LinearLayout>  


源码下载:http://download.csdn.net/detail/wwj_748/7806993


版权声明:本文为博主原创文章,未经博主允许不得转载。

你可能感兴趣的:(Android自定义DataTimePicker(日期选择器))