«

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

时间:2024-3-2 18:43     作者:韩俊     分类: Android


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






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

先看看效果:



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

自定义一个类:
/DateTimePicker/src/com/wwj/datetimepicker/DateTimePickDialogUtil.java

[java] view
plaincopy

package com.wwj.datetimepicker;

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

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.widget.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;

/**

  • 日期时间选择控件 使用方法: private EditText inputDate;//需要设置的日期时间文本编辑框 private String
  • initDateTime="2012年9月3日 14:44",//初始日期时间值 在点击事件中使用:
  • inputDate.setOnClickListener(new OnClickListener() {
  • @Override public void onClick(View v) { DateTimePickDialogUtil
  • dateTimePicKDialog=new
  • DateTimePickDialogUtil(SinvestigateActivity.this,initDateTime);
  • dateTimePicKDialog.dateTimePicKDialog(inputDate);
  • } });
  • @author
    */
    public class DateTimePickDialogUtil implements OnDateChangedListener,
    OnTimeChangedListener {
    private DatePicker datePicker;
    private TimePicker timePicker;
    private AlertDialog ad;
    private String dateTime;
    private String initDateTime;
    private Activity activity;

    /**

    • 日期时间弹出选择框构造函数
    • @param activity
    • :调用的父activity
    • @param initDateTime
    • 初始日期时间值,作为弹出窗口的标题和日期时间初始值
      */
      public DateTimePickDialogUtil(Activity activity, String initDateTime) {
      this.activity = activity;
      this.initDateTime = initDateTime;

    }

    public void init(DatePicker datePicker, TimePicker timePicker) {
    Calendar calendar = Calendar.getInstance();
    if (!(null == initDateTime || "".equals(initDateTime))) {
    calendar = this.getCalendarByInintData(initDateTime);
    } else {
    initDateTime = calendar.get(Calendar.YEAR) + "年"
    + calendar.get(Calendar.MONTH) + "月"
    + calendar.get(Calendar.DAY_OF_MONTH) + "日 "
    + calendar.get(Calendar.HOUR_OF_DAY) + ":"
    + calendar.get(Calendar.MINUTE);
    }

    datePicker.init(calendar.get(Calendar.YEAR),  
            calendar.get(Calendar.MONTH),  
            calendar.get(Calendar.DAY_OF_MONTH), this);  
    timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));  
    timePicker.setCurrentMinute(calendar.get(Calendar.MINUTE));  

    }

    /**

    • 弹出日期时间选择框方法
    • @param inputDate
    • :为需要设置的日期时间文本编辑框
    • @return
      */
      public AlertDialog dateTimePicKDialog(final EditText inputDate) {
      LinearLayout dateTimeLayout = (LinearLayout) activity
      .getLayoutInflater().inflate(R.layout.common_datetime, null);
      datePicker = (DatePicker) dateTimeLayout.findViewById(R.id.datepicker);
      timePicker = (TimePicker) dateTimeLayout.findViewById(R.id.timepicker);
      init(datePicker, timePicker);
      timePicker.setIs24HourView(true);
      timePicker.setOnTimeChangedListener(this);

      ad = new AlertDialog.Builder(activity)
      .setTitle(initDateTime)
      .setView(dateTimeLayout)
      .setPositiveButton("设置", new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog, int whichButton) {
      inputDate.setText(dateTime);
      }
      })
      .setNegativeButton("取消", new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog, int whichButton) {
      inputDate.setText("");
      }
      }).show();

      onDateChanged(null, 0, 0, 0);
      return ad;
      }

    public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
    onDateChanged(null, 0, 0, 0);
    }

    public void onDateChanged(DatePicker view, int year, int monthOfYear,
    int dayOfMonth) {
    // 获得日历实例
    Calendar calendar = Calendar.getInstance();

    calendar.set(datePicker.getYear(), datePicker.getMonth(),  
            datePicker.getDayOfMonth(), timePicker.getCurrentHour(),  
            timePicker.getCurrentMinute());  
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");  
    
    dateTime = sdf.format(calendar.getTime());  
    ad.setTitle(dateTime);  

    }

    /**

    • 实现将初始日期时间2012年07月02日 16:45 拆分成年 月 日 时 分 秒,并赋值给calendar
    • @param initDateTime
    • 初始日期时间值 字符串型
    • @return Calendar
      */
      private Calendar getCalendarByInintData(String initDateTime) {
      Calendar calendar = Calendar.getInstance();

      // 将初始日期时间2012年07月02日 16:45 拆分成年 月 日 时 分 秒
      String date = spliteString(initDateTime, "日", "index", "front"); // 日期
      String time = spliteString(initDateTime, "日", "index", "back"); // 时间

      String yearStr = spliteString(date, "年", "index", "front"); // 年份
      String monthAndDay = spliteString(date, "年", "index", "back"); // 月日

      String monthStr = spliteString(monthAndDay, "月", "index", "front"); // 月
      String dayStr = spliteString(monthAndDay, "月", "index", "back"); // 日

      String hourStr = spliteString(time, ":", "index", "front"); // 时
      String minuteStr = spliteString(time, ":", "index", "back"); // 分

      int currentYear = Integer.valueOf(yearStr.trim()).intValue();
      int currentMonth = Integer.valueOf(monthStr.trim()).intValue() - 1;
      int currentDay = Integer.valueOf(dayStr.trim()).intValue();
      int currentHour = Integer.valueOf(hourStr.trim()).intValue();
      int currentMinute = Integer.valueOf(minuteStr.trim()).intValue();

      calendar.set(currentYear, currentMonth, currentDay, currentHour,
      currentMinute);
      return calendar;
      }

    /**

    • 截取子串
    • @param srcStr
    • 源串
    • @param pattern
    • 匹配模式
    • @param indexOrLast
    • @param frontOrBack
    • @return
      */
      public static String spliteString(String srcStr, String pattern,
      String indexOrLast, String frontOrBack) {
      String result = "";
      int loc = -1;
      if (indexOrLast.equalsIgnoreCase("index")) {
      loc = srcStr.indexOf(pattern); // 取得字符串第一次出现的位置
      } else {
      loc = srcStr.lastIndexOf(pattern); // 最后一个匹配串的位置
      }
      if (frontOrBack.equalsIgnoreCase("front")) {
      if (loc != -1)
      result = srcStr.substring(0, loc); // 截取子串
      } else {
      if (loc != -1)
      result = srcStr.substring(loc + 1, srcStr.length()); // 截取子串
      }
      return result;
      }

}



/DateTimePicker/src/com/wwj/datetimepicker/DateTimePickerActivity.java

[java] view
plaincopy

package com.wwj.datetimepicker;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;

/**

  • 时间拾取器界面
  • @author wwj_748
  • */
    public class DateTimePickerActivity extends Activity {
    /* Called when the activity is first created. /
    private EditText startDateTime;
    private EditText endDateTime;

    private String initStartDateTime = "2013年9月3日 14:44"; // 初始化开始时间
    private String initEndDateTime = "2014年8月23日 17:44"; // 初始化结束时间

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // 两个输入框  
    startDateTime = (EditText) findViewById(R.id.inputDate);  
    endDateTime = (EditText) findViewById(R.id.inputDate2);  
    
    startDateTime.setText(initStartDateTime);  
    endDateTime.setText(initEndDateTime);  
    
    startDateTime.setOnClickListener(new OnClickListener() {  
        public void onClick(View v) {  
    
            DateTimePickDialogUtil dateTimePicKDialog = new DateTimePickDialogUtil(  
                    DateTimePickerActivity.this, initEndDateTime);  
            dateTimePicKDialog.dateTimePicKDialog(startDateTime);  
    
        }  
    });  
    
    endDateTime.setOnClickListener(new OnClickListener() {  
    
        public void onClick(View v) {  
            DateTimePickDialogUtil dateTimePicKDialog = new DateTimePickDialogUtil(  
                    DateTimePickerActivity.this, initEndDateTime);  
            dateTimePicKDialog.dateTimePicKDialog(endDateTime);  
        }  
    });  

    }
    }



自定义界面:
/DateTimePicker/res/layout/common_datetime.xml

[html] view
plaincopy

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&quot;
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

&lt;DatePicker  
    android:id=&quot;@&#43;id/datepicker&quot;  
    android:layout_width=&quot;wrap_content&quot;  
    android:layout_height=&quot;wrap_content&quot;  
    android:calendarViewShown=&quot;false&quot; /&gt;  

&lt;TimePicker  
    android:id=&quot;@&#43;id/timepicker&quot;  
    android:layout_width=&quot;wrap_content&quot;  
    android:layout_height=&quot;wrap_content&quot; /&gt;  

</LinearLayout>

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

android5.0补充内容:
android5.0时代,日期选择器变得更简单了,下面来看看:

// 日期选择器,
 DatePickerDialog dialog = new DatePickerDialog(ReasonDescriptionActivity.this,
                        AlertDialog.THEME_DEVICE_DEFAULT_DARK,
                        new DatePickerDialog.OnDateSetListener() {
                            @Override
                            public void onDateSet(DatePicker view, int year, int monthOfYear,
                                    int dayOfMonth) {
                                Log.d("TAG",year+"::"+monthOfYear+"::"+dayOfMonth);
                                chooseDate.setText(year+"-"+monthOfYear+"-"+dayOfMonth);
                            }
                        },2014,1,1);
                dialog.show();

// 时间选择器
                TimePickerDialog dialog = new TimePickerDialog(ReasonDescriptionActivity.this,
                        AlertDialog.THEME_DEVICE_DEFAULT_DARK,
                        new TimePickerDialog.OnTimeSetListener() {
                            @Override
                            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                                Log.d("TAG", hourOfDay + "::" + minute);
                                if(minute < 10) {
                                    chooseTime.setText(hourOfDay+":"+"0"+minute);
                                } else {
                                    chooseTime.setText(hourOfDay+":"+minute);
                                }
                            }
                        },12,0,true);
                dialog.show();

这样就变得更加简单了,直接利用系统内部组件即可,定义一个dialog即可!

标签: android

热门推荐