2015-02-11 18 views
17

Jestem nastawiony na i za pomocą interfejsu API 21 poziomu, używając AppCompat v21.Możliwość wybrania przyszłej daty ustawienia daty maksymalnej w datepickeru

Daje mi to ładnie szuka nowego wyboru daty, który ma nieoczekiwaną właściwość pozwala mi wybrać przyszłą datę kiedy max date został ustawiony za pomocą

datePicker.setMaxDate(Calendar.getInstance().getTimeInMillis()) 

Przyszłe terminy są wyszarzone, ale mogę nadal wybierz dowolną z nich. Czy to błąd? Czy robię to źle? Czy istnieje sposób, aby uniemożliwić użytkownikowi wybieranie przyszłej daty w selektorze dat?

Stary Selektor daty Holo nie zezwalał na wybór przyszłej daty podczas ustawiania maksymalnej daty.

UPDATE:

Chociaż nie działa prawidłowo na moim Nexus 4 działa magazynie 5.0, czy działa poprawnie na moim Nexus 6 z systemem Android 5.1.1 magazynie. Być może był to błąd w systemie Android 5.0 i został naprawiony w wersji 5.1? Czy ktoś może potwierdzić?

Odpowiedz

21

Więc odpowiedzieć na własną rękę pytanie:

Sprawdziłem źródło Androida DatePickerCalendarDelegate.java pod adresem grepcode, w szczególności pod numerem public void setMaxDate(long maxDate) dla obu wersji Androida: 5.0 i 5.1.

Co nowego w 5.1 setMaxDate() że

mDayPickerView.goTo(getSelectedDay(), false, true, true);

została zmieniona na:

mDayPickerView.setMaxDate(maxDate);

Wydaje się, że stała tam, co odpowiada z moich obserwacji wynika, że ​​to działa zgodnie z oczekiwaniami w 5.1, ale nie w 5.0.

Wygląda na to, że utknęliśmy w tym, że nie działa on poprawnie w systemie Android 5.0 (dni po tym, gdy maksymalna data jest wyszarzona, ale nadal można wybrać).

+0

więc co robimy? –

+0

Po prostu zignorowałem wybraną datę, jeśli użytkownik wybrał datę w przyszłości i wyświetlił komunikat o błędzie (snackbar lub toast). Innym rozwiązaniem może być również użycie innego datepika, być może https://github.com/wdullaer/MaterialDateTimePicker –

+0

W onDateSet() możemy umieścić czek taki jak ten Kalendarz kalendarza = Calendar.getInstance(); calendar.set (rok, monthOfYear, dayOfMonth); Kalendarz calendar1 = Calendar.getInstance(); if (calendar.getTime(). After (calendar1.getTime())) { Toast.makeToast (getApplicationContext, "Proszę wybrać poprawną datę, Toast.LENGTH_LONG) .show(); return; } – ashutiwari4

-1

Możesz użyć metody, w której możesz przekazać wartość daty wprowadzonej przez użytkownika i porównać ją na przykład z bieżącą datą, jeśli jest to data w przyszłości możesz zresetować wartość daty użytej do konkretnej daty (na przykład aktualna data) i pokaż toast, aby go poinformować.

+1

Dzięki, zdaję sobie sprawę, że mogę to zrobić, ale nie musiałem tego robić wcześniej (ze starym narzędziem do wybierania daty) i wydaje mi się dziwne, że muszę to teraz zrobić. Chciałbym wiedzieć, czy mogę wybrać selektor dat, aby nie pozwalał wybierać przyszłych dat (a jeśli nie, chciałbym się dowiedzieć, czy zespół Androida zrobił to celowo, lub jeśli to błąd). –

2

Używam tego i prawidłowej jego pracy

wywołać tę funkcję, aby otworzyć Date Picker

public void openDatePicker() { 
     DatePickerDialog dpd = new DatePickerDialog(this, mDateSetListener, mYear, mMonth, mDay); 
     dpd.getDatePicker().setMaxDate(System.currentTimeMillis()); 
     dpd.show(); 
    } 

Oto mDateSetListener

private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() { 
     @Override 
     public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
      mYear = year; 
      mMonth = monthOfYear; 
      mDay = dayOfMonth; 
      date.setText(dayOfMonth + "/" + (monthOfYear + 1) + "/" + year); // Here date is a TextView to display date 
      date.setVisibility(View.VISIBLE); 
     } 
    }; 
+0

Dzięki za udostępnienie ! Zaktualizowałem moje pytanie. –