Як вимкнути минулі дати в засобі вибору дат Android?


83

Як я можу вимкнути минулі дати в моєму виборі дат Android?

Ось код, який створює мій DatePicker:

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DATE_DIALOG_ID:
        // set date picker as current date
        return new DatePickerDialog(this, datePickerListener, year, month,
                day);
    }
    return null;
}

private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() {
    public void onDateSet(DatePicker view, int selectedYear,
            int selectedMonth, int selectedDay) {
        year = selectedYear;
        month = selectedMonth+1;
        day = selectedDay;

        startdate.setText(new StringBuilder().append(day).append("-")
                .append(getMonth(month + 1)).append("-").append(year)
                .append(" "));
    }
};

2
DatePickerDialog datePickerDialog = новий DatePickerDialog (getActivity (), дата, myCalendar.get (Calendar.YEAR), myCalendar.get (Calendar.MONTH), myCalendar.get (Calendar.DAY_OF_MONTH)); datePickerDialog.getDatePicker (). setMinDate (System.currentTimeMillis () - 1000); datePickerDialog.show ();
Діліп

Відповіді:


226

Ви можете зробити

datePicker.setMinDate(System.currentTimeMillis() - 1000);

яка встановлює сьогоднішню дату як мінімальну, а всі минулі дати вимкнено.

datePickerє об'єктом, DatePickerякщо ви використовуєте об'єкт, який DatePickerDialogви можете зробити

datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);

Примітка: setMinDateбуло представлено в API 11


Дякую за відповідь .. Де мені слід розмістити цей рядок?
Адді

1
Дякую за відповідь. Але коли я використав вищезазначене рішення, це призвело до збою в моїй програмі. Тож я змінив "System.currentTimeMillis () - 1000" на "System.currentTimeMillis () - 10000", і моя програма працювала бездоганно. Чи можете ви, будь ласка, дізнатись, чому я отримую аварію при відніманні 1000, а не на 10000
user3705697

3
попередні дати вимкнено, але їх можна вибрати :(
Sjd

1
цей також добре працює для мене datePickerDialog.getDatePicker (). setMinDate (System.currentTimeMillis ()), тоді в чому різниця між setMinDate (System.currentTimeMillis ()) і setMinDate (System.currentTimeMillis () - 1000)
RAJESH KUMAR ARUMUG ARUMUG ARUMUG

2
Чи можу я знати причину наявності -1000?
Cheok Yan Cheng

15

Цей спосіб буде працювати належним чином.

//Get yesterday's date
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -1);

//Set yesterday time milliseconds as date pickers minimum date
DatePickerDialog datePickerDialog = new DatePickerDialog(context, myDateListener, year, month, day);
datePickerDialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
datePickerDialog.show();

8

Ось як я це роблю:

public class DatePickerFragment extends DialogFragment {
OnDateSetListener ondateSet;
Calendar c;
int year = 0, month = 0, day = 0;

public DatePickerFragment() {
}

public void setCallBack(OnDateSetListener ondate) {
    ondateSet = ondate;
}

public static DatePickerFragment newInstance(Bundle bundle) {
    DatePickerFragment myFragment = new DatePickerFragment();
    myFragment.setArguments(bundle);
    return myFragment;
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // final Calendar c = Calendar.getInstance();
//if else for null arguments
    if (getArguments() != null) {
        year = getArguments().getInt("year");
        month = getArguments().getInt("month");
        day = getArguments().getInt("day");
        c = Calendar.getInstance();
        c.set(year, month, day);

    } else {
        c = Calendar.getInstance();
        year = c.get(Calendar.YEAR);
        month = c.get(Calendar.MONTH);
        day = c.get(Calendar.DAY_OF_MONTH);
        Log.d("else", "else");
    }


    DatePickerDialog picker = new DatePickerDialog(getActivity(),
            ondateSet, year, month, day);
    picker.getDatePicker().setMinDate(c.getTime().getTime());
    Log.d("picker timestamp", c.getTime().getTime() + "");
    return picker;
}
}

Ось як ви створюєте екземпляр засобу вибору:

Bundle bundle = new Bundle();
        Calendar c = Calendar.getInstance();
        bundle.putInt("year", c.get(Calendar.YEAR));
        bundle.putInt("month", c.get(Calendar.MONTH));
        bundle.putInt("day", c.get(Calendar.DAY_OF_MONTH));
        DatePickerFragment fragment = DatePickerFragment
                .newInstance(bundle);
        fragment.setCallBack(dateSet);
        fragment.show(getActivity().getSupportFragmentManager(), null);

Це моя реалізація, сміливо її змінюйте. Зверніть увагу, що цей код за замовчуванням встановлює mindate як дату currnet. Також важливим є newInstance.


6

З бібліотекою матеріальних компонентів просто використовуйте MaterialDatePickerта створюйте власну, DateValidatorабо ви можете просто використовувати DateValidatorPointForwardнадану бібліотекою.

Щось на зразок:

MaterialDatePicker.Builder<Long> builder = MaterialDatePicker.Builder.datePicker();

CalendarConstraints.DateValidator dateValidator = DateValidatorPointForward.now();
//if you need a custom date just use
//CalendarConstraints.DateValidator dateValidator = DateValidatorPointForward.from(yourDate);
constraintsBuilder.setValidator(dateValidator);
builder.setCalendarConstraints(constraintsBuilder.build());

MaterialDatePicker<Long> picker = builder.build();
picker.show(getSupportFragmentManager(), picker.toString());

введіть тут опис зображення


Мені подобається підхід до матеріалу "ось якийсь код, розберися". Я взяв це документування. github.com/material-components/material-components-android/blob/…
lasec0203

3

Ви можете використовувати цей рядок у своєму коді ...

private Calendar cal;
private int day;
private int month;
private int year;

static final int DATE_PICKER_ID = 1111; 
TextView textView;

    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            cal = Calendar.getInstance();
            day = cal.get(Calendar.DAY_OF_MONTH);
            month = cal.get(Calendar.MONTH);
            year = cal.get(Calendar.YEAR);
            showDialog(DATE_PICKER_ID);

        }
    });

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
        case DATE_PICKER_ID:
            // create a new DatePickerDialog with values you want to show

            DatePickerDialog datePickerDialog = new DatePickerDialog(this, datePickerListener, year, month, day);
            Calendar calendar = Calendar.getInstance();

            calendar.add(Calendar.DATE, 0); // Add 0 days to Calendar
            Date newDate = calendar.getTime();
            datePickerDialog.getDatePicker().setMinDate(newDate.getTime()-(newDate.getTime()%(24*60*60*1000)));
            return datePickerDialog;
    }
    return null;
}

private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() {
    // the callback received when the user "sets" the Date in the
    // DatePickerDialog
    public void onDateSet(DatePicker view, int selectedYear, int selectedMonth, int selectedDay) {

        textViewTime.setText(selectedDay + "/" + (selectedMonth + 1) + "/" + selectedYear);
    }
};

А для чого calendar.add(Calendar.DATE, 0);і Calendar calendarсам собі, якщо він не використовується? Дата newDate = нова дата (); достатньо.
CoolMind

3

Вихідні дані

Calendar c = Calendar.getInstance();
DatePickerDialog dialog = new DatePickerDialog(context, new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        String _year = String.valueOf(year);
        String _month = (month+1) < 10 ? "0" + (month+1) : String.valueOf(month+1);
        String _date = dayOfMonth < 10 ? "0" + dayOfMonth : String.valueOf(dayOfMonth);
        String _pickedDate = year + "-" + _month + "-" + _date;
        Log.e("PickedDate: ", "Date: " + _pickedDate); //2019-02-12
    }
}, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.MONTH));
dialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
dialog.show();

2

Гаразд, я використовую бібліотеку MaterialDatePicker та її занадто просто, щоб встановити мінімальну дату.

DatePickerDialog mDatePickerDialog = DatePickerDialog.newInstance(listener,
                mTime.year, mTime.month, mTime.monthDay);
mDatePickerDialog.setYearRange(2016, 2036);
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis() - 1000);
mDatePickerDialog.setMinDate(c);

2

Ви можете використовувати функцію DatePicker # setMinDate (), щоб встановити мінімальну дату.

 datePickerDialog.getDatePicker().setMinDate(calendar.getTimeInMillis());

1

У мене була та сама проблема. Ось як я це вирішив.

Крок 1: Заявіть прослуховувач кліків для відкриття засобу вибору дати.

dateTime.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
         showDateTimePicker();
     }
 });

Крок 2: Заявіть слухача, який прослуховує зміну дати.

    public void showDateTimePicker(){
     final Calendar currentDate = Calendar.getInstance();
     date = Calendar.getInstance();
     DatePickerDialog.OnDateSetListener dateSetListener = new 
     DatePickerDialog.OnDateSetListener() {
     @Override
     public void onDateSet(DatePicker datePicker, int year, int 
     monthOfYear, int dayOfMonth) {
     date.set(year, monthOfYear, dayOfMonth);
    //use this date as per your requirement
     }
 };
}

Крок 3: Тепер нам потрібно також оголосити діалогове вікно вибору дати всередині наведеного вище методу showDateTimePicker (). На цьому кроці ми також обмежимо доступ до минулих дат.

          public void showDateTimePicker(){
             final Calendar currentDate = Calendar.getInstance();
             date = Calendar.getInstance();

            DatePickerDialog.OnDateSetListener dateSetListener = new 
            DatePickerDialog.OnDateSetListener() {
             @Override
             public void onDateSet(DatePicker datePicker, int year, int 
             monthOfYear, int dayOfMonth) {
             date.set(year, monthOfYear, dayOfMonth);

            //use this date as per your requirement
             }
         };
          DatePickerDialog datePickerDialog = new  
          DatePickerDialog(**Your Activity Name.this**, dateSetListener, 
          currentDate.get(Calendar.YEAR), 
          currentDate.get(Calendar.MONTH),   
          currentDate.get(Calendar.DAY_OF_MONTH));
        // Limiting access to past dates in the step below:
 datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
         datePickerDialog.show();
        }

Це все, що вам потрібно зробити. Ось остаточний код, який ви можете побачити:

    private Date date;

dateTime.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             showDateTimePicker();
         }
     });



public void showDateTimePicker(){
 final Calendar currentDate = Calendar.getInstance();
date = Calendar.getInstance();

 DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {
     @Override
     public void onDateSet(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) {
         date.set(year, monthOfYear, dayOfMonth);

    //use this date as per your requirement
     }
 };
 DatePickerDialog datePickerDialog = new  DatePickerDialog(**Your Activity Name.this**, dateSetListener, currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH),   currentDate.get(Calendar.DAY_OF_MONTH));
 datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
 datePickerDialog.show();
}

Сподіваюся, це комусь допомагає.


Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, чому та / або як цей код відповідає на питання, покращує його довгострокове значення.
Vishal Chhodwani

@VishalChhodwani Дякуємо за вступ. Зробили деякі правки. :)
asm1609

1

Це залежить від того, що ви хочете відключити, якщо ви хочете встановити мінімальну дату до декількох днів, тоді найкращий підхід - використовувати LocalDateTime так:

        val ldt: LocalDateTime = LocalDateTime.now().minusDays(30)
        val zone: ZoneId = ZoneId.of("Europe/Berlin")

        val zoneOffSet: ZoneOffset = zone.rules.getOffset(ldt)
        dpd.datePicker.minDate = ldt.toInstant(zoneOffSet).toEpochMilli()
        dpd.datePicker.maxDate = System.currentTimeMillis()
        dpd.show()

Ви встановлюєте для нового місцевого часу час до мінус 30 днів, а після цього ви встановлюєте, в якому часовому поясі це має бути, для мого прикладу я використовую час "Європа / Берлін", ви прикріплюєте його до dpd. datePicker.minDate = ldt.toInstant (zoneOffSet) .toEpochMilli () встановлено на epochMilli і все


Дуже тонка відповідь. Дякую
ashishdhiman2007

1

Котлін

Безпосередньо до пункту вибору дати:

datePicker.minDate = System.currentTimeMillis()

Якщо ви використовуєте об'єкт DatePickerDialog:

datePickerDialog.datePicker.minDate = System.currentTimeMillis()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.