Làm cách nào để tắt các ngày trong quá khứ trong bộ chọn ngày của Android?


82

Làm cách nào để vô hiệu hóa các ngày đã qua trong bộ chọn ngày trên Android của tôi?

Đây là mã tạo DatePicker của tôi:

@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 (), date, myCalendar.get (Calendar.YEAR), myCalendar.get (Calendar.MONTH), myCalendar.get (Calendar.DAY_OF_MONTH)); datePickerDialog.getDatePicker (). setMinDate (System.currentTimeMillis () - 1000); datePickerDialog.show ();
Dilip,

Câu trả lời:


220

Bạn có thể làm

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

trong đó đặt ngày hôm nay là ngày tối thiểu và tất cả các ngày trong quá khứ đều bị vô hiệu hóa.

datePickerlà một đối tượng DatePickernếu bạn đang sử dụng một đối tượng của DatePickerDialogbạn có thể làm

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

Lưu ý: setMinDateđã được giới thiệu trong API 11


Cảm ơn vì đã phản hồi .. Tôi nên đặt dòng này ở đâu?
Addy

1
Cảm ơn bạn đã trả lời. Nhưng khi tôi sử dụng giải pháp trên, nó đã khiến ứng dụng của tôi gặp sự cố. Vì vậy, tôi đã thay đổi "System.currentTimeMillis () - 1000" thành "System.currentTimeMillis () - 10000" và ứng dụng của tôi hoạt động hoàn hảo. Bạn có thể hài lòng lemme biết lý do tại sao tôi đang nhận vụ tai nạn trên đã trừ 1000 nhưng không phải trên 10000
user3705697

3
các ngày trước đó đã bị vô hiệu hóa nhưng chúng có thể được chọn :(
Sjd

1
cái này cũng hoạt động tốt đối với tôi datePickerDialog.getDatePicker (). setMinDate (System.currentTimeMillis ()) thì sự khác biệt giữa setMinDate (System.currentTimeMillis ()) và setMinDate (System.currentTimeMillis () - 1000)
RAJESH KUMAR AR

2
Tôi có thể biết lý do của việc có -1000?
Cheok Yan Cheng

15

Phương pháp này sẽ hoạt động đúng.

//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

Đây là cách tôi làm điều đó:

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;
}
}

Đây là cách bạn khởi tạo bộ chọn:

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);

Đây là cách triển khai của tôi, vui lòng thay đổi nó. Lưu ý rằng mã này đặt tâm trí là ngày currnet theo mặc định. Ngoài ra, newInstance cũng quan trọng.


4

Với Thư viện Thành phần Vật liệu, chỉ cần sử dụng MaterialDatePickervà xây dựng của riêng DateValidatorbạn hoặc bạn chỉ có thể sử dụng DateValidatorPointForwardthư viện được cung cấp.

Cái gì đó như:

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());

nhập mô tả hình ảnh ở đây


Tôi thích cách tiếp cận "đây là một số mã, hãy tìm ra" material.io đã ghi lại điều này. github.com/material-components/material-components-android/blob/…
lasec0203

3

Bạn có thể sử dụng dòng này vào mã của mình ...

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);
    }
};

Và những gì cho calendar.add(Calendar.DATE, 0);và một Calendar calendarchính nó nếu nó không được sử dụng? Date newDate = new Date (); Là đủ.
CoolMind

3

Đầu ra

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

Được rồi, tôi đang sử dụng Thư viện MaterialDatePicker và quá đơn giản để đặt ngày tối thiểu trên đó.

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

Bạn có thể sử dụng hàm DatePicker # setMinDate () để đặt ngày tối thiểu.

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

1

Tôi gặp vấn đề tương tự. Đây là cách tôi giải quyết nó.

Bước 1: Khai báo trình nghe nhấp chuột để mở bộ chọn ngày.

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

Bước 2: Khai báo một trình nghe sẽ lắng nghe Thay đổi ngày.

    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
     }
 };
}

Bước 3: Bây giờ chúng ta cần khai báo hộp thoại chọn ngày bên trong phương thức showDateTimePicker () ở trên. Chúng tôi cũng sẽ giới hạn quyền truy cập vào các ngày trong quá khứ trong bước này.

          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();
        }

Đây là tất cả những gì bạn cần làm. Đây là mã cuối cùng mà bạn có thể muốn xem:

    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();
}

Hy vọng nó sẽ giúp một ai đó.


Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp thêm ngữ cảnh liên quan đến lý do và / hoặc cách mã này trả lời câu hỏi sẽ cải thiện giá trị lâu dài của nó.
Vishal Chhodwani

@VishalChhodwani Cảm ơn bạn đã đóng góp ý kiến. Đã thực hiện một số chỉnh sửa. :)
asm1609

1

Điều này phụ thuộc vào những gì bạn muốn tắt nếu bạn muốn đặt ngày tối thiểu lên đến vài ngày thì cách tốt nhất là sử dụng LocalDateTime như sau:

        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()

Bạn đặt ngày giờ địa phương mới tối đa là âm 30 ngày kể từ bây giờ và sau đó, bạn đặt múi giờ đó cần phải là múi giờ, ví dụ như tôi đang sử dụng giờ "Châu Âu / Berlin", bạn đính kèm nó vào dpd. datePicker.minDate = ldt.toInstant (zoneOffSet) .toEpochMilli () được đặt thành epochMilli và thế là xong


Câu trả lời rất tốt. Cảm ơn
ashishdhiman2007

1

Kotlin

Trực tiếp đến Công cụ chọn ngày:

datePicker.minDate = System.currentTimeMillis()

Nếu bạn đang sử dụng một đối tượng của DatePickerDialog:

datePickerDialog.datePicker.minDate = System.currentTimeMillis()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.