zoukankan      html  css  js  c++  java
  • Android自己定义DataTimePicker(日期选择器)

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


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

    先看看效果:


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


    自己定义一个类:
    /DateTimePicker/src/com/wwj/datetimepicker/DateTimePickDialogUtil.java
    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
    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
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <DatePicker
            android:id="@+id/datepicker"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:calendarViewShown="false" />
    
        <TimePicker
            android:id="@+id/timepicker"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
    </LinearLayout>




  • 相关阅读:
    【leetcode】416. Partition Equal Subset Sum
    【leetcode】893. Groups of Special-Equivalent Strings
    【leetcode】892. Surface Area of 3D Shapes
    【leetcode】883. Projection Area of 3D Shapes
    【leetcode】140. Word Break II
    【leetcode】126. Word Ladder II
    【leetcode】44. Wildcard Matching
    【leetcode】336. Palindrome Pairs
    【leetcode】354. Russian Doll Envelopes
    2017.12.22 英语面试手记
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5345791.html
Copyright © 2011-2022 走看看