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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_picker_time);initDefultBookTime();initUI();initData();}@Overrideprotected 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;}}@Overrideprotected 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;elsereturn value + "";}private View.OnClickListener viewListener = new View.OnClickListener() {@Overridepublic 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() {@Overridepublic 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;}}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}};@Overridepublic void finish() {super.finish();overridePendingTransition(R.anim.slide_in_top, R.anim.slide_out_bottom);}}

效果图

失败是成功的亲娘,没有失败哪来的成功呢?诺贝尔如果不经历千万次的失败,

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

相关文章:

你感兴趣的文章:

标签云: