Android 自定义日期和时间和星期的弹窗

public class MainActivity extends Activity implements OnClickListener {

	// 文本日期
	private TextView tvEndDate;
	private TextView tvEndTime;
	
	
	private Button button1;
	private Button button2; 
	private Intent localIntent;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.act_time_picker);

		tvEndDate = (TextView) findViewById(R.id.lv_publish_end_date_tv);
		tvEndTime = (TextView) findViewById(R.id.lv_publish_end_time_tv);
		initDataAndTime(tvEndDate, tvEndTime);
		

		button1 = (Button) findViewById(R.id.button1);
		button2 = (Button) findViewById(R.id.button2);
		
		button1.setOnClickListener(this);
		button2.setOnClickListener(this);
	}

	/**
	 * 初始化日期和时间 (定位时间到每周周五)
	 * 
	 * @param paramTextView1
	 * @param paramTextView2
	 */
	public void initDataAndTime(TextView paramTextView1, TextView paramTextView2) {

		Calendar localCalendar1 = Calendar.getInstance();
		int i = localCalendar1.get(1);
		int j = localCalendar1.get(2);
		int k = localCalendar1.get(5);
		int m = -1 + (7 + localCalendar1.get(5) - localCalendar1.get(7));
		int n = localCalendar1.get(11);
		if (((k == m) && (n >= 18)) || (k > m)) {
			m = -1 + (14 + localCalendar1.get(5) - localCalendar1.get(7));
		}
		if (m > DateTimeUtility.getDaysOfCurrentMonth()) {
			if (j + 1 >= 12) {
				i++;
			}
			Calendar localCalendar2 = DateTimeUtility
					.convertDateToCalendar(DateTimeUtility.covertStringToDate(i
							+ "-" + (j + 1) + "-" + m + " " + 18 + ":00",
							"yyyy-MM-dd HH:mm"));
			j = localCalendar2.get(2);
			m = localCalendar2.get(5);
		}
		paramTextView1.setText(i + "-" + (j + 1) + "-" + m);
		paramTextView2.setText(18 + ":" + "00");
	}

	@Override
	public void onClick(View v) {

		switch (v.getId()) {
		case R.id.button1:
			localIntent = new Intent(this, DateTimePickerActivity.class);
			localIntent.putExtra("date", tvEndDate.getText().toString() + " "+ tvEndTime.getText().toString());
			localIntent.putExtra("time", false);
			startActivityForResult(localIntent, 1003);

			break;
		case R.id.button2:
			localIntent = new Intent(this, DateTimePickerActivity.class);
			localIntent.putExtra("date", tvEndDate.getText().toString() + " "+ tvEndTime.getText().toString());
			localIntent.putExtra("time", true);
			startActivityForResult(localIntent, 1003);
			break;
		default:
			break;
		}
	}
	
	/**
	 * 返回的结果
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		int k;
		if (resultCode == -1) {

			if (requestCode != 1003) {
				return;
			}
			k = data.getIntExtra("isTime", 0);
			if (k == 2) {
				String endDate = data.getStringExtra("Day");
				tvEndDate.setText(endDate);
			}
			if (k == 1) {
				String endTime = data.getStringExtra("Times");
				tvEndTime.setText(endTime);
			}

		}
	}

}
public class DateTimePickerActivity extends Activity implements OnClickListener {

	protected String className = this.getClass().getName();

	private static final int theEndOfTheDay = 18;
	private static final int theNoonOfTheDay = 12;
	private Calendar calendar;
	private DatePicker datePicker;

	private int day;
	private int hourOfDay;
	private boolean isTime;
	private int minute;
	private int month;
	private TimePicker timePicker;
	private String[] weekDays;
	private int year;

	String str;

	// ----------------------------------------------
	private Button timeMakeSure;
	private Button timeNoon;
	private Button timeAfterNoon;
	private NumberPicker npTimeWeek;
	// -----------------------------------------------
	private Button dateMakeSure;
	private Button today;
	private Button tomorrow;
	private Button thisWeek;
	private NumberPicker npDateWeek;

	private String[] arrayOfStrings;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		initView();
		initData();
		initEvent();
	}

	private void initView() {

		showAsPopup(this);

		this.isTime = getIntent().getBooleanExtra("time", false);
		System.out.println("时间" + isTime);

		if (this.isTime) {
			System.out.println("如何不是时间-------");
			findViewById(R.id.day_group).setVisibility(View.VISIBLE);
			findViewById(R.id.time_group).setVisibility(View.GONE);
		}

		this.weekDays = getResources().getStringArray(R.array.week_day);
		this.npDateWeek = (NumberPicker) findViewById(R.id.np_date_week);
		this.npDateWeek.setMinValue(0);
		this.npDateWeek.setMaxValue(0);
		this.npDateWeek.setDisplayedValues(null);

		this.npTimeWeek = (NumberPicker) findViewById(R.id.np_time_week);
		this.npTimeWeek.setMinValue(0);
		this.npTimeWeek.setMaxValue(0);
		this.npTimeWeek.setDisplayedValues(null);

		this.datePicker = ((DatePicker) findViewById(R.id.date_pick));
		this.timePicker = ((TimePicker) findViewById(R.id.time_pick));

		timeMakeSure = (Button) findViewById(R.id.pick_time_make_sure);
		timeNoon = (Button) findViewById(R.id.time_noon);
		timeAfterNoon = (Button) findViewById(R.id.time_afternoon);
		// npTimeWeek = (NumberPicker) findViewById(R.id.np_time_week);

		// --------------------------------------------------------------
		dateMakeSure = (Button) findViewById(R.id.pick_date_make_sure);
		today = (Button) findViewById(R.id.today);
		tomorrow = (Button) findViewById(R.id.tomorrow);
		thisWeek = (Button) findViewById(R.id.this_week);

		/**
		 * 关闭可编辑模式
		 */
		npTimeWeek
				.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS);
		npDateWeek
				.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);
		datePicker
				.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);
		timePicker
				.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);
	}

	protected void initData() {

		str = getIntent().getStringExtra("date");

		System.out.println("得到的时间为:" + str + className);

		if (!TextUtils.isEmpty(str)) {

			initDateWeek(str);

			deteAndTimePickerChange();
		}
	}

	protected void initEvent() {

		try {
			/**
			 * 通过反射获取到日期
			 */
			Class localClass = this.datePicker.getClass();
			Class[] arrayOfClass = new Class[1];
			arrayOfClass[0] = Boolean.TYPE;
			@SuppressWarnings("unchecked")
			Method localMethod = localClass.getMethod("setCalendarViewShown",arrayOfClass);
			DatePicker localDatePicker = this.datePicker;
			Object[] arrayOfObject = new Object[1];
			arrayOfObject[0] = Boolean.valueOf(false);
			localMethod.invoke(localDatePicker, arrayOfObject);

			if (this.isTime) {

				this.timePicker.setVisibility(View.VISIBLE);
				this.datePicker.setVisibility(View.GONE);

				timeMakeSure.setOnClickListener(this);
				timeNoon.setOnClickListener(this);
				timeAfterNoon.setOnClickListener(this);

				findViewById(R.id.day_group).setVisibility(View.GONE);
				findViewById(R.id.time_group).setVisibility(View.VISIBLE);
				this.calendar = DateTimeUtility
						.convertDateToCalendar(DateTimeUtility
								.covertStringToDate(str, "yyyy-MM-dd HH:mm"));
			} else {

				dateMakeSure.setOnClickListener(this);
				today.setOnClickListener(this);
				tomorrow.setOnClickListener(this);
				thisWeek.setOnClickListener(this);
			}
		} catch (Exception localException) {
			//
			this.timePicker.setVisibility(View.VISIBLE);
			this.datePicker.setVisibility(View.GONE);
		}

	}

	/**
	 * 设置星期几
	 */
	private void setWeekDate() {
		try {
			this.calendar = DateTimeUtility
					.convertDateToCalendar(DateTimeUtility.covertStringToDate(
							this.year + "-" + (1 + this.month) + "-" + this.day
									+ " " + this.hourOfDay + ":00",
							"yyyy-MM-dd HH:mm"));
			int i = this.calendar.get(7);
			NumberPicker localNumberPicker = this.npDateWeek;
			arrayOfStrings = new String[1];
			arrayOfStrings[0] = this.weekDays[(i - 1)];
			localNumberPicker.setDisplayedValues(arrayOfStrings);

			System.out.println(arrayOfStrings[0] + className + "设置星期几的方法----");

		} catch (Exception localException) {
			localException.printStackTrace();
		}
	}

	/**
	 * 显示popWindow
	 * 
	 * @param paramActivity
	 */
	public static void showAsPopup(Activity paramActivity) {
		paramActivity.getWindow().setFlags(2, 2);
		WindowManager.LayoutParams localLayoutParams = paramActivity
				.getWindow().getAttributes();
		localLayoutParams.height = -1;
		localLayoutParams.width = -1;
		localLayoutParams.alpha = 1.0F;
		localLayoutParams.dimAmount = 0.5F;
		paramActivity.getWindow().setAttributes(localLayoutParams);
		paramActivity.setContentView(R.layout.picker_date_time);
	}

	/**
	 * 日期和时间改变时的方法
	 */
	private void deteAndTimePickerChange() {
		this.datePicker.init(this.year, this.month, this.day,
				new DatePicker.OnDateChangedListener() {
					public void onDateChanged(DatePicker view, int years,
							int monthOfYear, int dayOfMonth) {

						year = years;
						month = monthOfYear;
						day = dayOfMonth;

						System.out.println(years + "-" + monthOfYear + "-"
								+ dayOfMonth + "deteAndTimePickerChange调用了。。。");

						DateTimePickerActivity.this.setWeekDate();
					}
				});
		this.timePicker.setIs24HourView(Boolean.valueOf(true));
		this.timePicker.setCurrentHour(Integer.valueOf(this.hourOfDay));
		this.timePicker.setCurrentMinute(Integer.valueOf(this.minute));

		this.timePicker
				.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
					public void onTimeChanged(TimePicker view, int hourOfDays,
							int minutes) {

						hourOfDay = hourOfDays;
						minute = minutes;

						System.out.println(hourOfDay + ":" + minute
								+ "setOnTimeChangedListener调用了。。。");

					}
				});
		if (Build.VERSION.SDK_INT < 11) {

		}
	}
	/**
	 * 时间按钮确定的点击事件
	 */
	private void makeSureTimeOnClick() {

		Intent localIntent = new Intent();

		StringBuilder localStringBuilder = new StringBuilder()
				.append(hourOfDay).append(":");

		System.out.println(localStringBuilder.toString() + className);

		if (minute < 10) {

			String localObject = "0" + minute;
			localStringBuilder.append(localObject);
			localIntent.putExtra("Times", localStringBuilder.toString());

		}

		// System.out.println(className + "------点击确定后输出的日期为------" + year +
		// "-"+ (1 + month) + "-" + day);
		localIntent.putExtra("isTime", 1);
		setResult(-1, localIntent);
		finish();
	}

	/**
	 * 确定点击时的响应
	 */
	private void makeSureDateOnClick() {

		Intent localIntent = new Intent();
		localIntent.putExtra("Day", year + "-" + (1 + month) + "-" + day);
		System.out.println(className + "------点击确定后输出的日期为------" + year + "-"
				+ (1 + month) + "-" + day);
		localIntent.putExtra("isTime", 2);
		setResult(-1, localIntent);
		finish();
	}

	/**
	 * 本周按钮被点击
	 */
	private void thisWeekButtonClick() {
		Calendar localCalendar1 = Calendar.getInstance();
		int i = localCalendar1.get(1);
		int j = localCalendar1.get(2);
		int k = -1 + (7 + localCalendar1.get(5) - localCalendar1.get(7));
		int m = localCalendar1.get(11);
		int n = localCalendar1.get(5);
		if (((n == k) && (m >= 18)) || (n > k)) {
			k = -1 + (14 + localCalendar1.get(5) - localCalendar1.get(7));
		}
		if (k > DateTimeUtility.getDaysOfCurrentMonth()) {
			if (j + 1 >= 12) {
				i++;
			}
			Calendar localCalendar2 = DateTimeUtility
					.convertDateToCalendar(DateTimeUtility.covertStringToDate(i
							+ "-" + (j + 1) + "-" + k + " " + 18 + ":00",
							"yyyy-MM-dd HH:mm"));
			j = localCalendar2.get(2);
			k = localCalendar2.get(5);
		}
		datePicker.updateDate(i, j, k);
	}

	/**
	 * 明天按钮的点击
	 */
	private void tomorrowButtonClick() {
		Calendar localCalendar1 = Calendar.getInstance();
		int i = localCalendar1.get(1);
		int j = localCalendar1.get(2);
		int k = 1 + localCalendar1.get(5);
		if (k > DateTimeUtility.getDaysOfCurrentMonth()) {
			if (j + 1 >= 12) {
				i++;
			}
			Calendar localCalendar2 = DateTimeUtility
					.convertDateToCalendar(DateTimeUtility.covertStringToDate(i
							+ "-" + (j + 1) + "-" + k + " " + 18 + ":00",
							"yyyy-MM-dd HH:mm"));
			j = localCalendar2.get(2);
			k = localCalendar2.get(5);
		}
		datePicker.updateDate(i, j, k);
	}

	/**
	 * 今天按钮被点击
	 */
	private void todayButtonClick() {
		Calendar localCalendar = Calendar.getInstance();
		int i = localCalendar.get(1);
		int j = localCalendar.get(2);
		int k = localCalendar.get(5);
		datePicker.updateDate(i, j, k);
	}

	/**
	 * 下班按钮被点击
	 */
	private void timeAfterNoonClick() {
		Calendar localCalendar = Calendar.getInstance();
		localCalendar.get(1);
		localCalendar.get(2);
		localCalendar.get(5);
		timePicker.setCurrentHour(Integer.valueOf(18));
		timePicker.setCurrentMinute(Integer.valueOf(0));
	}

	/**
	 * 中午按钮被点击
	 */
	private void timeNoonClick() {
		Calendar localCalendar = Calendar.getInstance();
		localCalendar.get(1);
		localCalendar.get(2);
		localCalendar.get(5);
		timePicker.setCurrentHour(Integer.valueOf(12));
		timePicker.setCurrentMinute(Integer.valueOf(0));
	}

	/**
	 * 初始化星期几
	 */
	private void initDateWeek(String dateAndTime) {

		String date = spliteString(dateAndTime, " ", "index", "front"); // 日期
		String time = spliteString(dateAndTime, " ", "index", "back"); // 时间

		year = Integer.parseInt(spliteString(date, "-", "index", "front")); // 年份
		String monthAndDay = spliteString(date, "-", "index", "back"); // 月日

		month = Integer.parseInt(spliteString(monthAndDay, "-", "index",
				"front")) - 1; // 月
		day = Integer.parseInt(spliteString(monthAndDay, "-", "index", "back")); // 日

		hourOfDay = Integer.parseInt(spliteString(time, ":", "index", "front")); // 时
		minute = Integer.parseInt(spliteString(time, ":", "index", "back")); // 分


		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONTH, month);
		cal.set(Calendar.DAY_OF_MONTH, day);

		int i = cal.get(7);
		// 设置数字选择器的值
		NumberPicker localNumberPicker = this.npDateWeek;
		String[] arrayOfString = new String[1];
		arrayOfString[0] = this.weekDays[(i - 1)];

		// System.out.println(arrayOfString[0] + "======初始化星期几的方法=======");

		localNumberPicker.setDisplayedValues(arrayOfString);
		npTimeWeek.setDisplayedValues(arrayOfString);
	}

	/**
	 * 截取子串
	 * 
	 * @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;
	}

	protected void onDestroy() {
		this.datePicker = null;
		this.timePicker = null;
		super.onDestroy();
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.pick_time_make_sure:
			makeSureTimeOnClick();
			break;
		case R.id.time_noon:
			timeNoonClick();
			break;
		case R.id.time_afternoon:
			timeAfterNoonClick();
			break;
		case R.id.pick_date_make_sure:
			makeSureDateOnClick();
			break;
		case R.id.today:
			todayButtonClick();
			break;
		case R.id.tomorrow:
			tomorrowButtonClick();
			break;
		case R.id.this_week:
			thisWeekButtonClick();
			break;
		}

	}

}

 

public class DateTimeUtility {

	public static final long MILLISECONDS_PER_DAY = 86400000L;
	public static final long MILLISECONDS_PER_HOUR = 3600000L;
	public static final long MILLISECONDS_PER_MIN = 60000L;
	public static final long MILLISECONDS_PER_SECOND = 1000L;
	private static int _localTimeZoneOffsetInMilliseconds = TimeZone
			.getDefault().getRawOffset();
	private static final String _standardFormat = "yyyy-MM-dd HH:mm:ss";
	private static final String _standardFormat_ms = "yyyy-MM-dd HH:mm:ss.SSS";

	/**
	 * 转换日期成日历
	 * 
	 * @param paramDate
	 * @return
	 */
	public static Calendar convertDateToCalendar(Date paramDate) {
		Calendar localCalendar = Calendar.getInstance();
		localCalendar.setTime(paramDate);
		return localCalendar;
	}

	/**
	 * 转换本地到世界时间
	 * 
	 * @param paramDate
	 * @return
	 */
	public static Date convertLocalToUtc(Date paramDate) {
		return new Date(paramDate.getTime()
				- _localTimeZoneOffsetInMilliseconds);
	}

	/**
	 * 转换字符串成国内日期
	 * 
	 * @param paramString1
	 * @param paramString2
	 * @return
	 */
	private static Date convertStringToDateInternal(String paramString1,
			String paramString2) {
		SimpleDateFormat localSimpleDateFormat = new SimpleDateFormat(
				paramString2);
		try {
			Date localDate = localSimpleDateFormat.parse(paramString1);
			return localDate;
		} catch (ParseException localParseException) {
			
		}
		return null;
	}

	/**
	 * 转换国际时间成本地
	 * 
	 * @param paramDate
	 * @return
	 */
	public static Date convertUtcToLocal(Date paramDate) {
		return new Date(paramDate.getTime()
				+ _localTimeZoneOffsetInMilliseconds);
	}

	public static Date covertStringFromUtcStringDataToGmtDate(String paramString) {
		return convertUtcToLocal(covertStringToDate(paramString));
	}

	/**
	 * 转换字符串成日期
	 * 
	 * @param paramString
	 * @return
	 */
	public static Date covertStringToDate(String paramString) {
		if (TextUtils.isEmpty(paramString)) {
			return null;
		}
		return convertStringToDateInternal(paramString, "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 转换字符串成日期
	 * 
	 * @param paramString1
	 * @param paramString2
	 * @return
	 */
	public static Date covertStringToDate(String paramString1,
			String paramString2) {
		if (TextUtils.isEmpty(paramString1)) {
			return null;
		}
		return convertStringToDateInternal(paramString1, paramString2);
	}

	public static Date covertStringToDateWithMs(String paramString) {
		int i = paramString.length();
		if ((TextUtils.isEmpty(paramString)) && (i <= 4)) {
			return null;
		}
		if (paramString.charAt(i - 4) == '.') {
			return convertStringToDateInternal(paramString,
					"yyyy-MM-dd HH:mm:ss.SSS");
		}
		return convertStringToDateInternal(paramString, "yyyy-MM-dd HH:mm:ss");
	}

	public static long getDateDiffInDays(Date paramDate1, Date paramDate2) {
		return getDateDiffInMilliSeconds(paramDate1, paramDate2) / 86400000L;
	}

	public static long getDateDiffInHours(Date paramDate1, Date paramDate2) {
		return getDateDiffInMilliSeconds(paramDate1, paramDate2) / 3600000L;
	}

	public static long getDateDiffInMilliSeconds(Date paramDate1,
			Date paramDate2) {
		Calendar localCalendar1 = convertDateToCalendar(paramDate1);
		Calendar localCalendar2 = convertDateToCalendar(paramDate2);
		return localCalendar1.getTimeInMillis()
				- localCalendar2.getTimeInMillis();
	}

	public static long getDateDiffInSeconds(Date paramDate1, Date paramDate2) {
		return getDateDiffInMilliSeconds(paramDate1, paramDate2) / 1000L;
	}

	public static String getDateTimeString(Date paramDate) {
		return getDateTimeString(paramDate, "yyyy-MM-dd HH:mm:ss");
	}

	@SuppressLint("SimpleDateFormat")
	public static String getDateTimeString(Date paramDate, String paramString) {
		return new SimpleDateFormat(paramString).format(paramDate);
	}

	public static String getDateTimeStringWithMs(Date paramDate) {
		return getDateTimeString(paramDate, "yyyy-MM-dd HH:mm:ss.SSS");
	}

	public static int getDaysOfCurrentMonth() {
		Calendar localCalendar = Calendar.getInstance();
		localCalendar.set(5, 1);
		localCalendar.roll(5, -1);
		return localCalendar.get(5);
	}

	public static int getDaysOfYearMonth(int paramInt1, int paramInt2) {
		Calendar localCalendar = Calendar.getInstance();
		localCalendar.set(1, paramInt1);
		localCalendar.set(2, paramInt2 - 1);
		localCalendar.set(5, 1);
		localCalendar.roll(5, -1);
		return localCalendar.get(5);
	}
}

代码很简单,注释也写得比较清楚,我就不做过多赘述。

 

 

 

代码下载    http://download.csdn.net/detail/developandroid/9390047

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值