時(shí)間選擇器
如何選擇當(dāng)前時(shí)間之后的時(shí)間预麸,以當(dāng)前時(shí)間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 = {"今天", "明天"};
要點(diǎn):
- 使用原生控件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分鐘后的小時(shí)
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.對(duì)10分鐘后是今天還是明天的相關(guān)判斷
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) { //獲得數(shù)組中今天之后的list
newDayList.add(stringDay.get(i));
}
}
newDay = (String[]) newDayList.toArray(new String[newDayList.size()]); //list轉(zhuǎn)化為array
numDayTv.setMaxValue(newDay.length - 1);
numDayTv.setMinValue(0);
numDayTv.setDisplayedValues(newDay);
numDayTv.setValue(0);//設(shè)置默認(rèn)值
dayStr = newDay[0];
} else { //是今天
numDayTv.setMaxValue(valuesDays.length - 1);
numDayTv.setMinValue(0);
numDayTv.setDisplayedValues(valuesDays);
numDayTv.setValue(0);
dayStr = valuesDays[0];
}
4.根據(jù)今天或明天對(duì)小時(shí)的顯示判斷
numHourTv.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
if ("今天".equals(valuesDays[numDayTv.getValue()])) {//是今天
//array轉(zhuǎn)化為list
List<String> stringHour = Arrays.asList(valuesHour);
//選擇>=當(dāng)前小時(shí)的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.根據(jù)當(dāng)前的小時(shí)獲得分鐘數(shù)組
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.日期滾動(dòng)監(jiān)聽
numDayTv.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker numberPicker, int i, int i1) {
//i表示前一個(gè)角標(biāo)值器净,i1表示當(dāng)前角標(biāo)值
Log.i("", "onValueChange: i=" + i + ",i1=" + i1);
timeSelect();//獲取10分鐘后時(shí)間
if (!dateStr.equals(todayDateStr)) {//獲得滾動(dòng)后的日期
dayStr = newDay[i1];
} else {
dayStr = valuesDays[i1];
}
if (0 == i1) { //角標(biāo)為0時(shí),獲得動(dòng)態(tài)的時(shí)分
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 { //角標(biāo)不為0萍摊,時(shí)為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) { //獲得角標(biāo)為0的時(shí)分
currentMinuteStr = newMin[0];
currentHourStr = newHour[0];
} else {
currentMinuteStr = valuesMinute[0];
currentHourStr = valuesHour[0];
}
}
});
7.小時(shí)滾動(dòng)監(jiān)聽
numHourTv.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker numberPicker, int i, int i1) {
timeSelect(); //獲取10分鐘后時(shí)間
//如果日期和小時(shí)角標(biāo)都為0時(shí),獲得動(dòng)態(tài)的分鐘數(shù)組
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 { //分鐘數(shù)組為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.分鐘滾動(dòng)監(jiān)聽
numMinute.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker numberPicker, int i, int i1) {
if (0 == numDayTv.getValue() && 0 == numHourTv.getValue()) {
//日期和小時(shí)角標(biāo)為0時(shí)的分鐘
currentMinuteStr = newMin[i1];
} else {
currentMinuteStr = valuesMinute[i1];
}
}
});
//NumberPicker顏色設(shè)置
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 {
//設(shè)置分割線的顏色值
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;
}
}
}