NullPointerException при использовании DatePicker setMaxDate() в DatePickerDialog

Я использую DatePickerDialog и пытаюсь установить минимальную и максимальную даты, чтобы пользователь мог выбрать дату только в течение предыдущих 24 часов или следующих 24 часов.

Вот код (Обратите внимание, что он пытается установить минимальный / максимальный диапазон, только если работает на Android 3.0 или выше.)

private void showDatePickerDialog() {
    DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear,
                              int dayOfMonth) {
            calendar.set(Calendar.YEAR, year);
            calendar.set(Calendar.MONTH, monthOfYear);
            calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
            onCalendarChanged();
        }
    };

    DatePickerDialog dialog = new DatePickerDialog(this,
                                                   listener,
                                                   calendar.get(Calendar.YEAR),
                                                   calendar.get(Calendar.MONTH),
                                                   calendar.get(Calendar.DAY_OF_MONTH));
    setDatePickerDialogRange(dialog);
    dialog.show();
}

@SuppressLint("NewApi")
private void setDatePickerDialogRange(DatePickerDialog dialog) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        DatePicker picker = dialog.getDatePicker();
        long oneDayMilliseconds = 24 * 60 * 60 * 1000;
        long nowMilliseconds = new Date().getTime();
        long minDate = nowMilliseconds - oneDayMilliseconds;
        long maxDate = nowMilliseconds + oneDayMilliseconds;
        picker.setMinDate(minDate);
        picker.setMaxDate(maxDate);
    }
}

Это работает нормально при работе на устройстве 2.2, но на устройстве 4.0.4 (Galaxy Tab 2 7.0) я получаю следующее исключение:

11-14 07:58:08.917: E/AndroidRuntime(16611): FATAL EXCEPTION: main
11-14 07:58:08.917: E/AndroidRuntime(16611): java.lang.NullPointerException
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.CalendarView.onScroll(CalendarView.java:910)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.CalendarView.access$600(CalendarView.java:74)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.CalendarView$2.onScroll(CalendarView.java:771)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.AbsListView.invokeOnItemScrollListener(AbsListView.java:1391)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.ListView.layoutChildren(ListView.java:1705)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.AbsListView.onLayout(AbsListView.java:2040)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.View.layout(View.java:11330)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.ViewGroup.layout(ViewGroup.java:4235)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1502)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1415)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.View.layout(View.java:11330)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.ViewGroup.layout(ViewGroup.java:4235)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.View.layout(View.java:11330)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.ViewGroup.layout(ViewGroup.java:4235)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1633)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1417)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.View.layout(View.java:11330)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.ViewGroup.layout(ViewGroup.java:4235)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.View.layout(View.java:11330)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.ViewGroup.layout(ViewGroup.java:4235)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.View.layout(View.java:11330)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.ViewGroup.layout(ViewGroup.java:4235)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.View.layout(View.java:11330)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.ViewGroup.layout(ViewGroup.java:4235)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1502)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1415)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.View.layout(View.java:11330)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.ViewGroup.layout(ViewGroup.java:4235)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.View.layout(View.java:11330)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.ViewGroup.layout(ViewGroup.java:4235)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.View.layout(View.java:11330)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.ViewGroup.layout(ViewGroup.java:4235)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.View.layout(View.java:11330)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.ViewGroup.layout(ViewGroup.java:4235)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1548)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2505)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.os.Looper.loop(Looper.java:137)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at android.app.ActivityThread.main(ActivityThread.java:4514)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at java.lang.reflect.Method.invokeNative(Native Method)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at java.lang.reflect.Method.invoke(Method.java:511)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
11-14 07:58:08.917: E/AndroidRuntime(16611):    at dalvik.system.NativeStart.main(Native Method)

Это происходит немедленно. DatePickerDialog никогда не отображается.

Если я закомментирую setMaxDate() линия, то работает нормально. В этом случае минимальная дата соблюдается.

Если я изменю это на setMaxDate(nowMilliseconds)Я все еще получаю исключение NullPointerException.

4 ответа

Работал над этим довольно долго. Это ошибка в Android. Просто отключите просмотр календаря, и все будет в порядке:

picker.setCalendarViewShown(false);

Попробуйте заменить:

setDatePickerDialogRange(dialog);
dialog.show();

чтобы:

dialog.show();
someView.post(new Runnable() {
  public void run() {
    setDatePickerDialogRange(dialog);
  }
});

(где someView это какой-то Viewили Handler если у тебя есть)

Это задержит звонок setDatePickerDialogRange() до тех пор, пока диалоговое окно не будет отображено и может стать решением проблемы.

Это сработало>= API 19. Не знаю, работает ли под. Спасибо @JGGerrits.

Calendar min = (Calendar) minDate.clone();
Calendar max = (Calendar) maxDate.clone();
Calendar selected = (Calendar) selectedDate.clone();
min.set(Calendar.HOUR_OF_DAY, 0);
max.set(Calendar.HOUR_OF_DAY, 23);
selected.set(Calendar.HOUR_OF_DAY, 12);

DatePickerDialog datePickerDialog =
      new DatePickerDialog(context, callBack, selected);

if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
  datePickerDialog.getDatePicker().setCalendarViewShown(false);
}

datePickerDialog.getDatePicker().setMinDate(min.getTimeInMillis());
datePickerDialog.getDatePicker().setMaxDate(max.getTimeInMillis());
datePickerDialog.show();
I have seen an issue..

DatePicker setMinDate() а также setMaxDate() не работают, когда новая дата совпадает с предыдущей минимальной / максимальной датой

Пожалуйста, обратитесь по ссылке ниже. Ошибки в DatePicker setMinDate() и setMaxDate()

Другие вопросы по тегам