एंड्रॉइड डेट पिकर में पिछली तारीखों को कैसे अक्षम करें?


83

मैं अपने एंड्रॉइड डेट पिकर में पिछली तिथियों को कैसे अक्षम कर सकता हूं?

यहाँ वह कोड है जो मेरे 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 ();
— दिलीप

जवाबों:


226

तुम कर सकते हो

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

जो आज की तारीख को न्यूनतम तारीख के रूप में निर्धारित करता है और पिछली सभी तिथियां अक्षम हैं।

datePickerएक वस्तु है DatePickerअगर आप एक वस्तु का उपयोग कर रहे हैं DatePickerDialogआप कर सकते हैं

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

नोट: setMinDateएपीआई 11 में पेश किया गया था


प्रतिक्रिया के लिए धन्यवाद .. मुझे यह पंक्ति कहां रखनी चाहिए?
— Addy

1
जवाब के लिए धन्यवाद। लेकिन जब मैंने उपरोक्त समाधान का उपयोग किया तो इसने मेरे आवेदन में दुर्घटना कर दी। इसलिए मैंने "System.currentTimeMillis () - 1000" को "System.currentTimeMillis () - 10000" में बदल दिया और मेरे एप्लिकेशन ने पूरी तरह से काम किया। क्या आप यह जान सकते हैं कि मुझे पता नहीं है कि मैं १००० को घटाने पर दुर्घटनाग्रस्त क्यों हो रहा हूं लेकिन १२०० पर नहीं
— user3705697

3
पिछली तिथियां अक्षम हैं लेकिन उनका चयन किया जा सकता है :(
— Sjd

1
यह मेरे लिए भी ठीक काम करता है datePickerDialog.getDatePicker ()। setMinDate (System.currentTimeMillis ()) फिर setMinDate (System.currentTimeMillis) () और setMinDate (System.currentTimeMillis () - 1000)
— RAJESH

2
क्या मुझे इसका कारण पता चल सकता है -1000?
— चोक यान चेंग

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

यह मेरा कार्यान्वयन इसे बदलने के लिए स्वतंत्र है। ध्यान दें कि यह कोड डिफ़ॉल्ट रूप से मनोदशा दिनांक निर्धारित करता है। इसके अलावा 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());

यहां छवि विवरण दर्ज करें


मुझे "यहाँ कुछ कोड, यह पता लगाना है" दृष्टिकोण सामग्री पसंद है ।io ने यह दस्तावेज लिया। github.com/material-compenders/material-compenders-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 = नई तिथि (); पर्याप्त है।
— कूलमाइंड

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

आशा है कि यह किसी की मदद करता है।


हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह कोड क्यों और / या इस बारे में अतिरिक्त संदर्भ प्रदान करता है कि यह प्रश्न इसके दीर्घकालिक मूल्य में सुधार करता है।
— विशाल छड़वानी

@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

Kotlin

सीधे तिथि पिकर के लिए:

datePicker.minDate = System.currentTimeMillis()

यदि आप DatePickerDialog की एक वस्तु का उपयोग कर रहे हैं:

datePickerDialog.datePicker.minDate = System.currentTimeMillis()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.