Android 날짜 선택기에서 지난 날짜를 비활성화하는 방법은 무엇입니까?


82

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 = new DatePickerDialog (getActivity (), 날짜, myCalendar.get (Calendar.YEAR), myCalendar.get (Calendar.MONTH), myCalendar.get (Calendar.DAY_OF_MONTH)); datePickerDialog.getDatePicker (). setMinDate (System.currentTimeMillis ()-1000); datePickerDialog.show ();
Dilip

답변:


221

넌 할 수있어

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

오늘 날짜를 최소 날짜로 설정하고 모든 과거 날짜는 비활성화됩니다.

datePicker의 목적은 DatePicker당신의 개체를 사용하는 경우에 DatePickerDialog할 수있는 당신은

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

참고 : setMinDateAPI 11에서 도입되었습니다.


응답 해주셔서 감사합니다 ..이 줄을 어디에 넣어야하나요?
Addy 2014 년

1
답변 감사합니다. 그러나 위의 솔루션을 사용했을 때 응용 프로그램에서 충돌이 발생했습니다. 그래서 "System.currentTimeMillis ()-1000"을 "System.currentTimeMillis ()-10000"으로 변경했고 내 응용 프로그램이 완벽하게 작동했습니다. 1000을 빼면 충돌이 발생하지만 10000이 아닌 이유를 알려 주
시겠습니까

3
이전 날짜는 비활성화되지만 선택할 수 있습니다. (
Sjd

1
이것은 나에게도 잘 작동합니다 datePickerDialog.getDatePicker (). setMinDate (System.currentTimeMillis ()) 그러면 setMinDate (System.currentTimeMillis ())와 setMinDate (System.currentTimeMillis ()-1000)
RAJESH KUMAR ARUMUGAM

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 date로 설정합니다. 또한 newInstance가 중요합니다.


4

재료 구성 요소 라이브러리를 사용 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());

여기에 이미지 설명 입력


나는 이것을 문서화하는 material.io가 취한 "여기에 몇 가지 코드가 있습니다. 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 = new Date (); 충분합니다.
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 Library를 사용하고 있으며 최소 날짜를 설정하기에는 너무 간단합니다.

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 일로 설정하고 그 이후에는 "Europe / Berlin"시간을 사용하는 제 예에 필요한 시간대를 설정하고 dpd에 첨부합니다 . datePicker.minDate = ldt.toInstant (zoneOffSet) .toEpochMilli () 가 epochMilli로 설정되었습니다.


아주 좋은 대답입니다. 감사합니다
ashishdhiman2007

1

Kotlin

날짜 선택기로 직접 이동 :

datePicker.minDate = System.currentTimeMillis()

DatePickerDialog의 개체를 사용하는 경우 :

datePickerDialog.datePicker.minDate = System.currentTimeMillis()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.