android:最简单的方式实现自定义选择时间分钟间隔,非滚轮方式

目前项目只需要分钟的间隔,所以小时和月的间隔没有做,spiner有坑,做的不好,以后有空再重写一下;

解释参数

private int MAX_LIMITE_DAY = 30;//最大可选日期

private int EVERY_MININTES_SPCE= 10;//分钟间隙

private int MIN_MININTES_AFTER = 15;//当前时间到最近可用时间的间隔(最小时间段);

最小时间间隔的解释,

如果分钟间隙为1,最小间隔是1,那么就是自然分钟数1-59;

最小间隔15分钟 如果当前时间是10:00 那么最近一次可用的时间为 10:20,因为分钟每10分钟一个档,15分钟在第二档;

最小间隔15分钟 如果当前时间是10:40 那么最近一次可用的时间为 11:00;

最小间隔10分钟 如果当前世界是10:00,那么最近一次可用的时间为 11:10;10分钟一个档;

代码

package com.idonoo.shareCar.ui.commom.activitys;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.TimeZone;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import com.idonoo.frame.model.BookTimeRule;
import com.idonoo.shareCar.R;
import com.idonoo.shareCar.app.IntentExtra;
import com.idonoo.shareCar.uiframe.BaseActivity;

public class TimePickerActivity extends BaseActivity {

	private int MAX_LIMITE_DAY = 30;//最大可选日期
	private int EVERY_MININTES_SPCE= 10;//分钟间隙
	private int MIN_MININTES_AFTER = 15;//最小时间段

	private List<String> listDates = new ArrayList<String>(),
			listHours = new ArrayList<String>(),
			listMinuts = new ArrayList<String>();

	private Spinner spDate, spHour, spMinute;
	private ArrayAdapter<String> datesAdapter, hourAdapter, minuteAdapter;
	private TextView tvChooseTip;

	private Calendar calendar;
	private int currentYear;
	private int currentMonth;
	private int currentDay;
	private int currentHour;
	private int currentMinute;

	private boolean isAddNewHour = false,isOnlyHour=false;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_picker_time);
		initDefultBookTime();
		initUI();
		initData();
	}

	@Override
	protected void initUI() {
		super.initUI();
		TextView tvCacel = (TextView) findViewById(R.id.cacel);
		TextView tvSelect = (TextView) findViewById(R.id.select);
		tvCacel.setOnClickListener(viewListener);
		tvSelect.setOnClickListener(viewListener);
		findViewById(R.id.linear_empty).setOnClickListener(viewListener);
		spDate = (Spinner) findViewById(R.id.sp_date);
		spHour = (Spinner) findViewById(R.id.sp_hour);
		spMinute = (Spinner) findViewById(R.id.sp_minut);

		datesAdapter = new ArrayAdapter<String>(getApplicationContext(),
				R.layout.layout_spinner_item_text, R.id.tv_spinner_text, listDates);
		spDate.setAdapter(datesAdapter);

		hourAdapter = new ArrayAdapter<String>(getApplicationContext(),
				R.layout.layout_spinner_item_text, R.id.tv_spinner_text, listHours);
		spHour.setAdapter(hourAdapter);

		minuteAdapter = new ArrayAdapter<String>(getApplicationContext(),
				R.layout.layout_spinner_item_text, R.id.tv_spinner_text, listMinuts);
		spMinute.setAdapter(minuteAdapter);

		tvChooseTip = ((TextView)findViewById(R.id.tv_choose_tip));
		tvChooseTip.setText("可预约"+MIN_MININTES_AFTER+"分钟后,"+MAX_LIMITE_DAY+"天内的车辆");

		setViewClickListener(viewListener, R.id.tv_add_day,R.id.tv_add_hour,R.id.tv_add_minute,R.id.tv_sub_day,R.id.tv_sub_hour,R.id.tv_sub_minute);
	}

	private void initDefultBookTime() {
		int max = BookTimeRule.getBookMaxTime();
		if(max > 0) {
			MAX_LIMITE_DAY = max;
		}

		int min = BookTimeRule.getBookMinTime();
		if(min > 0 ) {
			MIN_MININTES_AFTER = min;
		}

		int interval = BookTimeRule.getBookIntervalTime();
		if(interval > 0) {
			EVERY_MININTES_SPCE = interval;
		}
	}

	@Override
	protected void initData() {

		calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00"));
		currentYear = calendar.get(Calendar.YEAR);
		currentMonth = calendar.get(Calendar.MONTH);
		currentDay = calendar.get(Calendar.DAY_OF_MONTH);
		currentHour = calendar.get(Calendar.HOUR_OF_DAY);
		currentMinute = calendar.get(Calendar.MINUTE);

		spDate.setOnItemSelectedListener(itemSelectListener);
		spHour.setOnItemSelectedListener(itemSelectListener);
		spMinute.setOnItemSelectedListener(itemSelectListener);

		isOnlyHour=getIntent().getBooleanExtra("OnlyHour", false);
		if(isOnlyHour){
			calendar.add(Calendar.DAY_OF_MONTH, 1);
			for (int i = 0; i < 24; i++) {
				listHours.add(i + "点");
			}
			tvChooseTip.setText("请选择一个时间点");
			findViewById(R.id.tv_add_day).setVisibility(View.GONE);
			findViewById(R.id.tv_add_minute).setVisibility(View.GONE);
			findViewById(R.id.tv_sub_hour).setVisibility(View.GONE);
			findViewById(R.id.tv_sub_minute).setVisibility(View.GONE);
			spDate.setVisibility(View.GONE);
			spMinute.setVisibility(View.GONE);
			hourAdapter.notifyDataSetChanged();
		}else{
			initDates();
		}

	}

	private void initDates() {

		isAddNewHour = false;
		initHours();

		Calendar day = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00"));
		listDates.clear();
		for (int i=0; i < MAX_LIMITE_DAY; i++) {
			if(isAddNewHour&¤tHour==23){
				day.add(Calendar.DAY_OF_MONTH, 1);
				listDates.add(buildDay(day));
			}else{
				listDates.add(buildDay(day));
				day.add(Calendar.DAY_OF_MONTH, 1);
			}
		}
		datesAdapter.notifyDataSetChanged();

	}

	private void initHours(){
		isAddNewHour=false;
		listMinuts.clear();
		listHours.clear();

		buildMinutes(currentMinute,true);

		if(isAddNewHour) {
			for (int i = currentHour+1; i < 24; i++) {
				listHours.add(i + "点");
			}
			calendar.set(Calendar.HOUR_OF_DAY, currentHour+1);
		}else{
			for (int i = currentHour; i < 24; i++) {
				listHours.add(i + "点");
			}
			calendar.set(Calendar.HOUR_OF_DAY, currentHour);
		}
		hourAdapter.notifyDataSetChanged();
		minuteAdapter.notifyDataSetChanged();
	}

	private String buildDay(Calendar calendar) {
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		int month = calendar.get(Calendar.MONTH);
		int week = calendar.get(Calendar.DAY_OF_WEEK);

		Calendar tCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00"));
		int today = tCalendar.get(Calendar.DAY_OF_MONTH);
		int tmonth= tCalendar.get(Calendar.MONTH);
		int space = day - today;
		if(tmonth!=month) space  = -1;
		String tweek = "";
		switch (space) {
		case 0:
			tweek ="今天";
			break;
		case 1:
			tweek ="明天";
			break;
		case 2:
			tweek ="后天";
			break;
		default: {
			switch (week) {
			case 2:
				tweek ="周一";
				break;
			case 3:
				tweek ="周二";
				break;
			case 4:
				tweek ="周三";
				break;
			case 5:
				tweek ="周四";
				break;
			case 6:
				tweek ="周五";
				break;
			case 7:
				tweek ="周六";
				break;
			case 1:
				tweek ="周日";
				break;
			}
		}
			break;
		}
		StringBuilder text = new StringBuilder();
		text.append(month + 1).append("月");
		text.append(day).append("日");
		text.append("(");
		text.append(tweek);
		text.append(")");
		return text.toString();
	}

	private void buildMinutes(int giveMinutes,boolean isAssociateHour) {
		int destMinute = giveMinutes+MIN_MININTES_AFTER;
		if(giveMinutes==-1)
			destMinute = -1;
		if(isAssociateHour){//第一版版本问题,先这样吧;
			if(destMinute>=60){
				destMinute = destMinute - 60;
				isAddNewHour = true;
			}
			else{
				isAddNewHour = false;
			}
		}

		listMinuts.clear();
		int skip = (int)Math.ceil(Double.valueOf(destMinute)/Double.valueOf(EVERY_MININTES_SPCE));
		int startIndex = EVERY_MININTES_SPCE*skip;
		if(startIndex==60){
			startIndex = 0;
			isAddNewHour = true;
		}
		for(int index = startIndex;index<=59;index+=EVERY_MININTES_SPCE){
			if(index<0) continue;
			listMinuts.add(buildTimeTextExt(index)+"分");
		}
	}

	private String buildTimeText() {
		StringBuilder text = new StringBuilder();
		text.append(calendar.get(Calendar.MONTH) + 1).append("月");
		text.append(buildTimeTextExt(calendar.get(Calendar.DAY_OF_MONTH))).append(
				"日");
		text.append(buildTimeTextExt(calendar.get(Calendar.HOUR_OF_DAY))).append(
				":");
		text.append(buildTimeTextExt(calendar.get(Calendar.MINUTE)));
		return text.toString();
	}

	private String buildTimeTextExt(int value) {
		if (value < 10)
			return "0" + value;
		else
			return value + "";
	}

	private View.OnClickListener viewListener = new View.OnClickListener() {
		@Override
		public void onClick(View v) {

			switch (v.getId()) {
			case R.id.cacel:
				finish();
				break;
			case R.id.linear_empty:
			case R.id.select:
				calendar.set(Calendar.SECOND,0);
				Intent intent = new Intent();
				intent.putExtra(IntentExtra.EXTRA_TIME_TEXT, buildTimeText());
				intent.putExtra(IntentExtra.EXTRA_DEPART_TIME, calendar);
				setResult(Activity.RESULT_OK, intent);
				finish();
				break;
			case R.id.tv_add_day:
				break;
			case R.id.tv_add_hour:
				break;
			case R.id.tv_add_minute:
				break;
			case R.id.tv_sub_day:
				break;
			case R.id.tv_sub_hour:
				break;
			case R.id.tv_sub_minute:
				break;
			}
		}
	};

	private void rebuildDates(Calendar calendar) {
		listHours.clear();
		listMinuts.clear(); 

		int checkDay=calendar.get(Calendar.DAY_OF_MONTH);
		int checkHour=calendar.get(Calendar.HOUR_OF_DAY);
		int checkMinute=calendar.get(Calendar.MINUTE);
		//选择今天
		if (currentDay==checkDay&¤tHour == checkHour) {
			initDates();
		}else if(currentDay==checkDay){
			//天相同,但是初始化时被加过一天,重新计算小时和分钟数
			if(isAddNewHour&¤tHour==checkHour-1){
				initHours();
			}else{
				//如果被加过一天,跳过已经加过的那天
				int hour=isAddNewHour?currentHour+1:currentHour;
				rebuildDates(hour, -1, checkHour, checkMinute);
			}
		}else{
			rebuildDates(0,-1, checkHour, checkMinute);
		}

	}

	private void rebuildDates(int hour,int minute,int checkHour,int checkMinute){

		for (int i = hour; i < 24; i++) {
			listHours.add(i + "点");
		}
		buildMinutes(minute, false);

		hourAdapter.notifyDataSetChanged();
		minuteAdapter.notifyDataSetChanged();

		if(!isOnlyHour){
			int hours = checkHour;
			int mnites =currentMinute;
			try{
				hours = Integer.parseInt(spHour.getSelectedItem().toString().replace("点", "").trim());
				mnites = Integer.parseInt(spMinute.getSelectedItem().toString().replace("分", "").trim());
			}catch(Exception ex){
			}
			calendar.set(Calendar.HOUR_OF_DAY, hours);
			calendar.set(Calendar.MINUTE, mnites);
		}
	}

	private OnItemSelectedListener itemSelectListener = new OnItemSelectedListener() {

		@Override
		public void onItemSelected(AdapterView<?> parent, View view,
				int position, long id) {
			switch (parent.getId()) {
			case R.id.sp_date:
				int selectDay=currentDay + position;
				if(position!=0&&isAddNewHour&¤tHour==23) selectDay=selectDay+1;
				calendar.set(Calendar.YEAR, currentYear);
				calendar.set(Calendar.MONTH, currentMonth);
				calendar.set(Calendar.DAY_OF_MONTH,selectDay);
				rebuildDates(calendar);
				break;
			case R.id.sp_hour:
				int hour = Integer.parseInt(parent.getItemAtPosition(position).toString().replace("点", "").trim());
				calendar.set(Calendar.HOUR_OF_DAY, hour);
				rebuildDates(calendar);
				break;
			case R.id.sp_minut:
				int mnite = Integer.parseInt(parent.getItemAtPosition(position).toString().replace("分", "").trim());
				calendar.set(Calendar.MINUTE, mnite);
				break;
			}
		}

		@Override
		public void onNothingSelected(AdapterView<?> parent) {

		}
	};

	@Override
	public void finish() {
		super.finish();
		overridePendingTransition(R.anim.slide_in_top, R.anim.slide_out_bottom);
	}
}

效果图

时间: 2024-12-12 04:30:59

android:最简单的方式实现自定义选择时间分钟间隔,非滚轮方式的相关文章

微信企业号简单的OAuth2验证接口实例(使用SpringMVC非注解方式)

目前企业号只提供了scope为"snsapi_base"的应用授权作用域,也就是不会跳转到让用户授权的页面. 之前写了使用注解方式验证并获取用户信息的实例,大家不是很理解,问题很多,现在附上简单的验证获取用户信息的实例! 微信企业号OAuth2验证接口实例(使用SpringMVC) OAuth2.0验证需要注意: 1.redirect_uri参数是授权回调地址,也就是说这个地址外网是可以访问的,所以如果使用本地映射服务器的猿们请修改为外网可以访问的地址! 2.配置可信域名,可信域名是1

【Android进度条】三种方式实现自定义圆形进度条ProgressBar

一.通过动画实现 定义res/anim/loading.xml如下: [html] view plaincopyprint? <?xml version="1.0" encoding="UTF-8"?> <animation-list android:oneshot="false" xmlns:android="http://schemas.android.com/apk/res/android"> &

使用Kotlin开发Android应用(IV):自定义视图和Android扩展

使用Kotlin开发Android应用(IV):自定义视图和Android扩展 @author ASCE1885的 Github 简书 微博 CSDN 原文链接 在读完扩展函数和默认值这篇文章之后,那么接下来要介绍什么呢?在本系列第一篇文章中我们说过,Kotlin使得Android开发更加简单,本文我们将进一步作介绍. 自定义视图 你应该还记得,在说到Kotlin的局限性时,我们提到了在Kotlin早期版本(M10之前)是不支持自定义视图的,因为当时只能为每个类创建一个构造函数.这通常是足够的,

移动端UI设计越来越流行的高斯模糊(Gaussian blur)和毛玻璃效果(磨砂效果),如何使用Android RenderScript简单实现?

高斯模糊(Gaussian blur)和毛玻璃效果(亦称磨砂效果),近两年在移动端的UI设计上越来越流行,特别是iOS手机上出现的较多,iOS系统也提供了相应的API帮助开发人员分分钟实现这两个效果.而Android系统则经历了一个漫长的探索过程,对图片的处理,从Java算法到NDK方式实现等,各种摸索层出不穷. 值得欣慰的是,Google终于在API 11中引入了 RenderScript ,一个强大的图片处理框架,帮助Android开发人员专注于图片处理算法而不是API的调度工作.使用Ren

Android WIFI 简单用法

随着Wifi的普及,在开发App的时候对wifi的考虑越来越多了.例如程序的升级在wifi下可以省很多流量,在通信软件中的视频通话.可以实现高画质的传输等等,Android提供了WifiManager类来帮助开发者们管理Wifi.下面就简单来说一下WifiManager的简单用法把. 权限: 为了使用WfiManager 我们需要在Androidmanifest.xml 加入权限: //本例中使用了前两个.具体请按照需要添加权限. <uses-permission android:name=&quo

【转】Android Studio简单设置

原文网址:http://ask.android-studio.org/?/article/14 Android Studio 简单设置 界面设置 默认的 Android Studio 为灰色界面,可以选择使用炫酷的黑色界面.Settings --> Appearance --> Theme ,选择 Darcula 主题即可. 字体设置 系统字体设置 如果你的Android Studio界面中,中文显示有问题,或者选择中文目录显示有问题,或者想修改菜单栏的字体,可以这么设置.Settings -

Android NDK 简单介绍、工具安装、环境配置

NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. * NDK提供了一系列的工具,帮助开发人员高速开发C(或C++)的动态库,并能自己主动将so和java应用一起打包成apk.这些工具对开发人员的帮助是巨大的. * NDK集成了交叉编译器,并提供了对应的mk文件隔离平台.CPU.API等差异,开发者仅仅须要简单改动mk文件(指出"哪些文件须要编译"."编译特性要求"等),就能够创建出so. * NDK能够自己主动地将so和Ja

Android学习系列(41)--Android Studio简单使用

1. 环境 UBUNTU 14.04 + Android Studio 0.8.2 2. 安装jdk openjdk-7是一个很好的选择: sudo apt-get update sudo apt-get install openjdk-7-jdk 不排除你需要选择一个默认版本: sudo update-alternatives --config java sudo update-alternatives --config javac 3. 安装Android Studio 在UBUNTU有两种

Android 使用OpenCV之编译环境非CygWin方式(Win7+Eclipse+ADT+CDT+NDK)

本文完全基于官网: https://dl-ssl.google.com/android/eclipse/ 只有简单的三步,官网写的非常简明全面,非常佩服 [准备] 1. Eclipse(Indigo) 2. ADT: 这个不说了,无非就是eclipse添加个android的安装源,如果这里选择了NDK Plugin的话,就会自动安装CDT哟: 3. NDK(android-ndk-r9d-windows-x86_64) 地址: http://developer.android.com/tools