在onTimeSet方法中的賦值語句會被執行兩次,后發現這個方法會被執行那個兩次
monthEnd = monthEnd+1;
Log.e("month==value", "month:"+monthEnd);
本來系統的月份比實際少一個月,加1就可以了,點一次執行兩次就相當於,我選的7月,而實際卻變成了9月。
onDateSet方法把month的值賦值給了成員monthMember即monthMember = month,在onTimeSet中把month+1設置給了textview,即textview.setText(month+1),這個時候就會自動加2,所以避免這種執行兩次的情況。
網上一搜,說這是android4.1和4.2存在的一個bug,點擊確定和取消按鈕時,會出發onTimeSet;在dialog的onStop(比如dialog dismiss時)中,也調用了onTimeSet方法。需要修改framework里的TimePickerDialog.java源文件
所以說復寫對話框注掉onStop就行了,
@Override
protected void onStop() {
// TODO Auto-generated method stub
//super.onStop();
}
protected void onStop() {
// TODO Auto-generated method stub
//super.onStop();
}
我的解決辦法是
1:在onDateSet方法中monthMember = month+1;來完成賦值,然后再把monthMember設置給textview,onTimeSet中只是完成了textview.settext(monthMember);並沒有加1的操作,即使是onTimeSet執行兩次也無所謂,不會受到影響。
endTime.setOnClickListener(new OnClickListener() { private int yearEnd = 0; private int monthEnd = 0; private int dayEnd = 0; @Override public void onClick(View v) { TimePickerDialog tpDialog = new TimePickerDialog(StartActivity.this, new OnTimeSetListener() { private String hour2_02; private String minute2_02; @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { System.out.println("--timePicker-----" + hourOfDay + "-----" + minute); String hour2_01 = hourOfDay + ""; if (hour2_01.length() == 1) { hour2_02 = "0" + hour2_01; } else { hour2_02 = hour2_01; } String minute2_01 = minute + ""; if (minute2_01.length() == 1) { minute2_02 = "0" + minute2_01; } else { minute2_02 = minute2_01; } Log.e("SSSSS", "hour2_02:"+hour2_02+",minute2_02"+minute2_02); list_time.add(hour2_02 + ":" + minute2_02 + ":00"); int hourTemp = hourOfDay - 3; if(hourTemp <=0){ hourTemp = hourTemp+12; } Log.e("設置date", "設置date"); monthEnd = monthEnd+1; Log.e("month==value", "month:"+monthEnd); Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(System.currentTimeMillis()); int hourVariable = cal.get(Calendar.HOUR); int minVariable = cal.get(Calendar.MINUTE); int yearVariable = cal.get(Calendar.YEAR); int monthVariable = cal.get(Calendar.MONTH); int dayVariable = cal.get(Calendar.DAY_OF_MONTH); if(yearEnd>yearVariable){//選的時間大於當前時間 yearEnd = yearVariable; if(monthEnd>minVariable){ monthEnd = minVariable; if(dayEnd > dayVariable){ dayEnd = dayVariable; if(hourOfDay > hourVariable){ hourOfDay = hourVariable; if(minute > minVariable){ minute = minVariable; } } } } } endTime.setText(yearEnd+"-"+ monthEnd+"-"+dayEnd+" "+hourOfDay+":"+minute+":00"); startTime.setText(yearEnd+"-"+ monthEnd+"-"+dayEnd+" "+hourTemp+":"+minute+":00");//這個是顯示最新 的 } }, hourVariable, minVariable, false); tpDialog.show(); DatePickerDialog dpDialog = new DatePickerDialog(StartActivity.this,new OnDateSetListener() { private String month2_02; private String day2_02; private String hour2_02; private String minute2_02; public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { if (list_time.size() == 0) { // 時間沒選 int i = Calendar.HOUR_OF_DAY; int minute = Calendar.MINUTE; String hour2_01 = i + ""; if (hour2_01.length() == 1) { hour2_02 = "0" + hour2_01; } else { hour2_02 = hour2_01; } String minute2_01 = minute + ""; if (minute2_01.length() == 1) { minute2_02 = "0" + minute2_01; } else { minute2_02 = minute2_01; } list_time.add(hour2_02 + ":" + minute2_02 + ":00"); Log.e("SSSSS2", "hour2_02:"+hour2_02+",minute2_02"+minute2_02); } System.out.println("--gjhf------datePicker---------" + year + "---" + monthOfYear + "----" +dayOfMonth + "---"); System.out.println("---end time------" + list_time.get(list_time.size() - 1)); String month2_01 = (monthOfYear + 1) + ""; if (month2_01.length() == 1) { month2_02 = "0" + month2_01; } else { month2_02 = month2_01; } String day2_01 = dayOfMonth + ""; if (day2_01.length() == 1) { day2_02 = "0" + day2_01; } else { day2_02 = day2_01; } list_data_time.add(year + "-" + month2_02 + "-" + day2_02 + list_time.get(list_time.size() - 1)); // dialog.cancel(); /*if (flag_dialog) { dialogData(); flag_dialog = false; }*/ Log.e("==========", "year"+year); // startTime.setText(year+"-"+ monthOfYear+"-"+dayOfMonth+" "+hour2_02+":"+minute2_02); // startTime.setText(list_data_time.get(list_time.size() - 1));//這里不能設置,頂多能保存 Log.e("date -time11 ", list_data_time.get(list_time.size() - 1)); yearEnd = year; monthEnd = monthOfYear; dayEnd = dayOfMonth; } }, yearVariable, monthVariable-1, dayVariable); dpDialog.show(); } });
2:第二種解決辦法:
//復寫對話框注掉onStop就行了, @Override protected void onStop() { // TODO Auto-generated method stub //super.onStop(); }