2015-03-08 2 views
0

Я знаю, что Android CalendarView является одним из самых сложных программ в истории человечества, но я должен использовать его, поэтому пришел сюда с просьбой.Android CalendarView: не могу установить минимальную дату и выбранную дату

мне нужно открыть CalendarView с:

  • минимальная дата, установленная на сегодняшний день;
  • выбранные даты установлены на сегодняшний день.

Это, как я это делаю:

int day = 8; 
int month = 2; 
int year = 2015; 

Calendar calendar = Calendar.getInstance(); 
calendar.set(year, month, day); 

CalendarView calendarView = (CalendarView) findViewById(R.id.calendarView); 
calendarView.setMinDate(calendar.getTimeInMillis()-2000); 

calendarView.setDate(calendar.getTimeInMillis(), true, false); 
fixIncredibleBugOfCalendarView(calendarView, calendar); 
calendarView.setOnDateChangeListener(this); 

При запуске предыдущего кода, CalendarView:

  • показывает 9-го марта в качестве первого выбираемого дня, вместо того, 8-й (DAY_OF_MONTH начинается с 1);

  • показывает 15 марта в качестве выбранной даты;

Так я гениально решил включить две строки, отмеченные *:

int day = 8; 
int month = 2; 
int year = 2015; 

Calendar calendar = Calendar.getInstance(); 
calendar.set(year, month, day); 

CalendarView calendarView = (CalendarView) findViewById(R.id.calendarView); 
calendar.add(Calendar.DAY_OF_MONTH, -1); // * - subtract one day, i.e. March 7 
calendarView.setMinDate(calendar.getTimeInMillis()); 

calendar.add(Calendar.DAY_OF_MONTH, 1); // * add one day, back to 8 
calendarView.setDate(calendar.getTimeInMillis(), true, false); 
fixIncredibleBugOfCalendarView(calendarView, calendar); 
calendarView.setOnDateChangeListener(this); 

В первой строке я удалить один день, во втором я добавить один.

С этой еще две линии, мои CalendarView показывает:

  • 7 марта, в качестве первой даты по выбору;
  • 15 марта, в качестве выбранной даты.

Метод fixIncredibleBugOfCalendarView(...) должен что-то исправить (я нашел его на SO):

private void fixIncredibleBugOfCalendarView(CalendarView cal, Calendar date) { 
     // Workaround for CalendarView bug relating to setMinDate(): 
     // https://code.google.com/p/android/issues/detail?id=42750 
     // Set then reset the date on the calendar so that it properly 
     // shows today's date. The choice of 24 months is arbitrary. 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      date.add(Calendar.MONTH, 24); 
      cal.setDate(date.getTimeInMillis(), false, true); 
      date.add(Calendar.MONTH, -24); 
      cal.setDate(date.getTimeInMillis(), false, true); 
     } 
    } 

Это не должно быть так трудно, и я не думаю, что это ошибка: это более вероятно, что это моя вина , Два вопроса: Не могли бы вы так любезно рассказать мне, как:

  • сообщить CalendarView минимальную дату, когда она должна отображаться?
  • есть CalendarView показывается как selected что я решаю - это выбранная дата?

Приветствия

+0

Если CalendarView не работает, почему бы не использовать [альтернативу] (https://github.com/square/android-times-square)? Существуют и другие альтернативы. – JonasCz

+0

Спасибо. Поскольку я провел день на этом, я хотел бы узнать, может ли кто-то решить проблему: это очень простая задача. В противном случае я буду использовать альтернативы (трудно поверить, что простой выборщик, созданный Android-разработчиками, настолько ошибочен, а альтернатив нет). –

+0

Возможно, попробуйте [этот ответ] (http://stackoverflow.com/a/20683328/4428462), возможно, вместе с методом 'fixIncredibleBugOfCalendarView'? – JonasCz

ответ

0

Это поздно, вероятно, вы уже решили дело. Но вот мой код, чтобы решить его

android.icu.util.Calendar c = android.icu.util.Calendar.getInstance(); 

    Long min = c.getTime().getTime(); 
    Long max = 2629746000L + c.getTime().getTime(); 


    CalendarView cv = (CalendarView) findViewById(R.id.date_picker); 
    cv.setMinDate(min); 
    cv.setMaxDate(max); 

Вы можете также CalenderView просто необходимо иметь MinDate в длинном формате. Вы также можете пойти на java

Data d = new Date(); 
d.getTime(); 

Но почему-то это не работает из-за текущего TimeZone. Вместо этого Calender возвращает объект DateObject относительно текущего набора TimeZone.

Смежные вопросы