时间选择

时间选择器
如何选择当前时间之后的时间,以当前时间10分钟后为例。
private String[] valuesHour = {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11","12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"};
private String[] valuesMinute = {"00","01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11","12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24","25", "26", "27", "28", "29", "30","31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48","49", "50", "51","52", "53", "54", "55", "56", "57", "58", "59"};
private String[] valuesDays = {"今天", "明天"};

要点:

  1. 使用原生控件NumberPicker
    numDayTv = (NumberPicker) view.findViewById(R.id.num_day);
    numHourTv = (NumberPicker) view.findViewById(R.id.num_hour);
    numMinute = (NumberPicker) view.findViewById(R.id.num_minute);

2.获取10分钟后的日期
Calendar calendar = Calendar.getInstance();
//将日历的分钟加10,得到10分钟后的日历
calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) + 10);
//10分钟后的小时
currentHourStr = calendar.get(Calendar.HOUR_OF_DAY)+ "";
//10分钟后的分钟
currentMinuteStr = calendar.get(Calendar.MINUTE) + "";
Date date = new Date(calendar.getTimeInMillis());
SimpleDateFormat format = new SimpleDateFormat("MM月dd日");
//得到10分钟后的日期格式
dateStr = format.format(date);
//日期day 显示
Date date1 = new Date(System.currentTimeMillis());
//今天的日期格式
todayDateStr = format.format(date1);

3.对10分钟后是今天还是明天的相关判断
numDayTv.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
if (!dateStr.equals(todayDateStr)) { //如果不是今天
List<String> stringDay = Arrays.asList(valuesDays);
ArrayList newDayList = new ArrayList();
for (int i = 0; i < valuesDays.length; i++) {
if (0 != i) { //获得数组中今天之后的list
newDayList.add(stringDay.get(i));
}
}
newDay = (String[]) newDayList.toArray(new String[newDayList.size()]); //list转化为array
numDayTv.setMaxValue(newDay.length - 1);
numDayTv.setMinValue(0);
numDayTv.setDisplayedValues(newDay);
numDayTv.setValue(0);//设置默认值
dayStr = newDay[0];
} else { //是今天
numDayTv.setMaxValue(valuesDays.length - 1);
numDayTv.setMinValue(0);
numDayTv.setDisplayedValues(valuesDays);
numDayTv.setValue(0);
dayStr = valuesDays[0];
}

4.根据今天或明天对小时的显示判断
numHourTv.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
if ("今天".equals(valuesDays[numDayTv.getValue()])) {//是今天
//array转化为list
List<String> stringHour = Arrays.asList(valuesHour);
//选择>=当前小时的list
ArrayList newHourList = new ArrayList();
for (int i = 0; i < valuesHour.length; i++) {
if (Integer.parseInt(stringHour.get(i)) >= Integer.parseInt(currentHourStr)){
newHourList.add(stringHour.get(i));
}
}
newHour = (String[]) newHourList.toArray(new String[newHourList.size()]);
numHourTv.setMaxValue(newHour.length - 1);
numHourTv.setMinValue(0);
numHourTv.setDisplayedValues(newHour);
numHourTv.setValue(0);
currentHourStr = newHour[0];
} else { //不是今天,0-23
numHourTv.setMaxValue(valuesHour.length - 1);
numHourTv.setMinValue(0);
numHourTv.setDisplayedValues(valuesHour);
numHourTv.setValue(0);
currentHourStr = valuesHour[0];
}

5.根据当前的小时获得分钟数组
numMinute.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
if (currentHourStr.equals(newHour[numHourTv.getValue()])) {
List<String> stringMin = Arrays.asList(valuesMinute);
ArrayList newMinList = new ArrayList();
for (int i = 0; i < valuesMinute.length; i++) {
if (Integer.parseInt(stringMin.get(i)) >= Integer.parseInt(currentMinuteStr)) {
newMinList.add(stringMin.get(i));
}
}
newMin = (String[]) newMinList.toArray(new String[newMinList.size()]);
numMinute.setMaxValue(newMin.length - 1);
numMinute.setMinValue(0);
numMinute.setDisplayedValues(newMin);
numMinute.setValue(0);
currentMinuteStr = newMin[0];
} else {
numMinute.setMaxValue(valuesMinute.length - 1);
numMinute.setMinValue(0);
numMinute.setDisplayedValues(valuesMinute);
numMinute.setValue(0);
currentMinuteStr = valuesMinute[0];
}
setNumberPickerDividerColor(numDayTv);
setNumberPickerDividerColor(numHourTv);
setNumberPickerDividerColor(numMinute);

6.日期滚动监听
numDayTv.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker numberPicker, int i, int i1) {
//i表示前一个角标值,i1表示当前角标值
Log.i("", "onValueChange: i=" + i + ",i1=" + i1);
timeSelect();//获取10分钟后时间
if (!dateStr.equals(todayDateStr)) {//获得滚动后的日期
dayStr = newDay[i1];
} else {
dayStr = valuesDays[i1];
}
if (0 == i1) { //角标为0时,获得动态的时分
List<String> strings = Arrays.asList(valuesHour);
ArrayList newHourList = new ArrayList();
for (int j = 0; j < valuesHour.length; j++) {
if (Integer.parseInt(strings.get(j)) >= Integer.parseInt(currentHourStr)) {
newHourList.add(strings.get(j));
}
}
newHour = (String[]) newHourList.toArray(new String[newHourList.size()]);
numHourTv.setMaxValue(newHour.length - 1);
numHourTv.setMinValue(0);
numHourTv.setDisplayedValues(newHour);
numHourTv.setValue(0);

        List<String> stringMin = Arrays.asList(valuesMinute);
        ArrayList newMinList = new ArrayList();
        for (int j = 0; j < valuesMinute.length; j++) {
            if (Integer.parseInt(stringMin.get(j)) >= Integer.parseInt(currentMinuteStr)) {
                newMinList.add(stringMin.get(j));
            }
        }
        newMin = (String[]) newMinList.toArray(new String[newMinList.size()]);
        numMinute.setMaxValue(newMin.length - 1);
        numMinute.setMinValue(0);
        numMinute.setDisplayedValues(newMin);
        numMinute.setValue(0);
    } else { //角标不为0,时为0-23,分为0-59
        numMinute.setDisplayedValues(valuesMinute);
        numMinute.setMaxValue(valuesMinute.length - 1);
        numMinute.setMinValue(0);
        numMinute.setValue(0);


        numHourTv.setDisplayedValues(valuesHour);
        numHourTv.setMaxValue(valuesHour.length - 1);
        numHourTv.setMinValue(0);
        numHourTv.setValue(0);

    }
    if (0 == i1) { //获得角标为0的时分
        currentMinuteStr = newMin[0];
        currentHourStr = newHour[0];
    } else {
        currentMinuteStr = valuesMinute[0];
        currentHourStr = valuesHour[0];
    }

}

});

7.小时滚动监听
numHourTv.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker numberPicker, int i, int i1) {
timeSelect(); //获取10分钟后时间
//如果日期和小时角标都为0时,获得动态的分钟数组
if (0 == i1 && 0 == numDayTv.getValue()) {
List<String> stringMin = Arrays.asList(valuesMinute);
ArrayList newMinList = new ArrayList();
for (int j = 0; j < valuesMinute.length; j++) {
if (Integer.parseInt(stringMin.get(j)) >= Integer.parseInt(currentMinuteStr)) {
newMinList.add(stringMin.get(j));
}
}
newMin = (String[]) newMinList.toArray(new String[newMinList.size()]);
numMinute.setMaxValue(newMin.length - 1);
numMinute.setMinValue(0);
numMinute.setDisplayedValues(newMin);
numMinute.setValue(0);
currentMinuteStr = newMin[0];
currentHourStr = newHour[i1];
} else { //分钟数组为0-59
numMinute.setDisplayedValues(valuesMinute);
numMinute.setMaxValue(valuesMinute.length - 1);
numMinute.setMinValue(0);
numMinute.setValue(0);
currentMinuteStr = valuesMinute[0];
if (0 == numDayTv.getValue()) {
currentHourStr = newHour[i1];
} else {
currentHourStr = valuesHour[i1];
}

    }

}

});

8.分钟滚动监听
numMinute.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker numberPicker, int i, int i1) {
if (0 == numDayTv.getValue() && 0 == numHourTv.getValue()) {
//日期和小时角标为0时的分钟
currentMinuteStr = newMin[i1];
} else {
currentMinuteStr = valuesMinute[i1];
}
}
});

//NumberPicker颜色设置
private void setNumberPickerDividerColor(NumberPicker numberPicker) {
NumberPicker picker = numberPicker;
Field[] pickerFields = NumberPicker.class.getDeclaredFields();
for (Field pf : pickerFields) {
if (pf.getName().equals("mSelectionDivider")) {
pf.setAccessible(true);
try {
//设置分割线的颜色值
pf.set(picker, new ColorDrawable(this.getResources().getColor(R.color.checkboxnormal)));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (Resources.NotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
// 分割线高度
for (Field pf : pickerFields) {
if (pf.getName().equals("mSelectionDividerHeight")) {
pf.setAccessible(true);
try {
int result = 1;
pf.set(picker, result);
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容