简体   繁体   English

对 Android 中的 DatePickerDialog 设置限制?

[英]Set Limit on the DatePickerDialog in Android?

How to limit on DatePickerDialog to choose a date from 2-12 years in the past or from 0-2 years from the current date?如何限制 DatePickerDialog 选择过去 2-12 年或当前日期 0-2 年的日期?

I have DatePickerDialog in activity which is used for getting the date of birth for child and infant.我在活动中有 DatePickerDialog 用于获取儿童和婴儿的出生日期。 Child age will be (2-12yrs) and infant age can be (0-2ys).儿童年龄为(2-12 岁),婴儿年龄可为(0-2 岁)。 If I pass 1 then the age limit should be (2-12yrs) and if I pass 2 the age limit should be (0-2yrs).如果我通过 1,那么年龄限制应该是(2-12 岁),如果我通过 2,那么年龄限制应该是(0-2 岁)。

What could I do to get this functionality in my calendar?我该怎么做才能在我的日历中获得此功能?

My Calender code is:我的日历代码是:

date = new DatePickerDialog.OnDateSetListener() {

            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear,
                    int dayOfMonth) {
                // TODO Auto-generated method stub
                myCalendar.set(Calendar.YEAR, year);
                myCalendar.set(Calendar.MONTH, monthOfYear);
                myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
                String myFormat = "dd/MM/yy"; //In which you need put here
                SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
                dateofBirth.setText(sdf.format(myCalendar.getTime()));
            }
        };

dateofBirth.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                showDialog(DATE_DIALOG_ID);

            }
        });

public Dialog onCreateDialog(int id) {
    final Calendar now = Calendar.getInstance();

    switch (id) {
    case DATE_DIALOG_ID:
        // set date picker as current date
        DatePickerDialog _date =   new DatePickerDialog(this, date,myCalendar
                .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                myCalendar.get(Calendar.DAY_OF_MONTH)){
            @Override

            public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth){   

                if (year > now.get(Calendar.YEAR))

                    view.updateDate(myCalendar
                            .get(Calendar.YEAR), myCalendar
                            .get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));

                if (monthOfYear > now.get(Calendar.MONTH) && year == now.get(Calendar.YEAR))
                    view.updateDate(myCalendar
                            .get(Calendar.YEAR), myCalendar
                            .get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));

                if (dayOfMonth > now.get(Calendar.DAY_OF_MONTH) && year == now.get(Calendar.YEAR) && 
                        monthOfYear == now.get(Calendar.MONTH))
                    view.updateDate(myCalendar
                            .get(Calendar.YEAR), myCalendar
                            .get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
            }

        };

        return _date;
    }
    return null;
}

All the other answers seem rather convoluted, so I'm just going to state the obvious: you can get the underlying DatePicker from a DatePickerDialog (by simply calling getDatePicker() ) and set its bounds using:所有其他的答案似乎颇为曲折,所以我只是不言自明的:你可以得到基本DatePickerDatePickerDialog (通过简单地调用getDatePicker()并使用设置其范围:

Where the argument is the usual number of milliseconds since January 1, 1970 00:00:00 in the default time zone.其中参数是默认时区中自 1970 年 1 月 1 日 00:00:00 以来的通常毫秒数。 You'll still have to calculate these values of course, but that should be trivial to do with the Calendar class: just take the current date and add or substract x years.当然,您仍然需要计算这些值,但这对于Calendar类来说应该是微不足道的:只需获取当前日期并添加或减去x年。

The more attentive reader will notice that the aforementioned setters weren't available until API level 11. If you're targeting that (or newer) platform only, then you're good to go.细心的读者会注意到上述 setter 直到 API 级别 11 才可用。如果您只针对该(或更新的)平台,那么您很高兴。 If you also want to support ie Gingerbread devices (Android 2.3 / API level 9+), you can use a backported version of DatePicker in stead.如果您还想支持 ie Gingerbread 设备(Android 2.3 / API 级别 9+),您可以改用DatePicker移植版本

Setting minumum and maximum date for the DatePickerDialog is not enough.为 DatePickerDialog 设置最小和最大日期是不够的。 User can click on the year and scroll in between years.用户可以单击年份并在年份之间滚动。

You should also set year range on the DatePicker like this:您还应该像这样在 DatePicker 上设置年份范围:

datePicker.setYearRange(calendar.get(Calendar.YEAR), calendar.get(Calendar.YEAR) + 1);

I am not in a position to give you the working code, since I am on a tour and didn't have access to my PC.我无法向您提供工作代码,因为我正在旅行并且无法访问我的 PC。 but I can give you a way to achieve your aim (or so i think).但我可以给你一种方法来实现你的目标(或者我认为)。

I am not sure this will work perfectly, but any way worth a try.我不确定这会完美地工作,但任何方式都值得一试。

Pls try this code and inform me.请尝试此代码并通知我。

"DatepickerType" is an Integer public Member variable of the class. “DatepickerType”是该类的整数公共成员变量。

private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() {

    // when dialog box is closed, below method will be called.
    public void onDateSet(DatePicker view, int selectedYear,
            int selectedMonth, int selectedDay) {
        int y = Calendar.getInstance().get(Calendar.YEAR);
        switch(DatepickerType){
        case 1:
            if(selectedYear>(y-2)){
                //Add message if you want
                selectedYear = y-2;
            }
                else if(selectedYear<(y-12)) {
                //Add msg if u want
                    selectedYear = y-12;
            }

        case 2:
            if(selectedYear>(y)){
                //Add message if you want
                selectedYear = y;
            }
                else if(selectedYear<(y-2)) {
                //Add msg if u want
                    selectedYear = y-2;
            }
        }

        String year1 = String.valueOf(selectedYear);
        String month1 = String.valueOf(selectedMonth+1);
        String day1 = String.valueOf(selectedDay);
        //do what you need
        setLastStatus();

    }
};
    datePickerDialog = new CustomDatePickerDialog(this,
                new OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker view, int year,
                            int monthOfYear, int dayOfMonth) {
                        // TODO Auto-generated method stub
                        try {
                            Log.i("DAta SEt", "data set");
                        } catch (Exception e) {

                        }

                    }

                }, minYear, minMonth, minDay, maxYear, maxMonth, maxDay);

CustomDatePickerDialog:自定义日期选择器对话框:

public class CustomDatePickerDialog extends DatePickerDialog {

private boolean mIgnoreEvent = false, mignorsunday = true;

public static int mYear, mMonth, mDate, maxYear, maxMonth, maxDay, minYear,
        minMonth, minDay;
public static int dateflag = 0;
public static int dateflag2 = 0;

public CustomDatePickerDialog(Context context, OnDateSetListener callBack,
        int year, int monthOfYear, int dayOfMonth, int maxYear,
        int maxMonth, int maxDay) {
    super(context, callBack, year, monthOfYear, dayOfMonth);
    // TODO Auto-generated constructor stub
    dateflag = 0;
    dateflag2 = 1;
    mYear = year;
    mMonth = monthOfYear;
    mDate = dayOfMonth;

    Log.i("Hello World ::", "Please Its Updating At Every time");

    this.maxYear = maxYear;
    this.maxMonth = maxMonth;
    this.maxDay = maxDay;
    this.minYear = year;
    this.minMonth = monthOfYear;
    this.minDay = dayOfMonth;

    // setTitle("בחרו מתי נח לכם שנתקשר");
    setTitle("We Call U...בחרו מתי נוח לכם ש");

}

@Override
public void onDateChanged(DatePicker view, int year, int month, int day) {
    // TODO Auto-generated method stub
    super.onDateChanged(view, year, month, day);
    dateflag = 1;
    dateflag2 = 1;
    if (!mIgnoreEvent) {
        mIgnoreEvent = true;
        if (year > maxYear || month > maxMonth && year == maxYear
                || day > maxDay && year == maxYear && month == maxMonth) {
            mYear = maxYear;
            mMonth = maxMonth;
            mDate = maxDay;
            view.updateDate(maxYear, maxMonth, maxDay);
        } else if (year < minYear || month < minMonth && year == minYear
                || day < minDay && year == minYear && month == minMonth) {
            mYear = minYear;
            mMonth = minMonth;
            mDate = minDay;
            view.updateDate(minYear, minMonth, minDay);
        } else {
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, year);
            cal.set(Calendar.MONTH, month);
            cal.set(Calendar.DATE, day);
            if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {

                if (mignorsunday) {
                    cal.add(Calendar.DATE, 1);
                    mYear = cal.get(Calendar.YEAR);
                    mMonth = cal.get(Calendar.MONTH);
                    mDate = cal.get(Calendar.DATE);
                    mignorsunday = false;
                } else if (!mignorsunday) {
                    mignorsunday = true;
                    cal.add(Calendar.DATE, -1);
                    mYear = cal.get(Calendar.YEAR);
                    mMonth = cal.get(Calendar.MONTH);
                    mDate = cal.get(Calendar.DATE);
                }
            } else {
                mYear = year;
                mMonth = month;
                mDate = day;
            }
            view.updateDate(mYear, mMonth, mDate);
        }
        setTitle("We Call U...בחרו מתי נוח לכם ש");
        mIgnoreEvent = false;
    }
}

public int getSelectedYear() {
    return mYear;
}

public int getSelectedMonth() {
    return mMonth;
}

public int getSelectedDate() {
    return mDate;
}
}

Here is the working code, you have to do some changes according to your code.这是工作代码,您必须根据您的代码进行一些更改。 Like you can add min and max age for child and infant.就像您可以为儿童和婴儿添加最小和最大年龄。

private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

    public void onDateSet(DatePicker view, int year, int monthOfYear,
                          int dayOfMonth) {
    /*
     * mYear = year;
     * mMonth = monthOfYear;
     * mDay = dayOfMonth;
     */
        if (year > maxYear || monthOfYear > maxMonth && year == maxYear ||
                dayOfMonth > maxDay && year == maxYear && monthOfYear == maxMonth) {
            view.updateDate(maxYear, maxMonth, maxDay);
            //you can add toast message here for max year selection
        } else if (year < minYear || monthOfYear < minMonth && year == minYear ||
                dayOfMonth < minDay && year == minYear && monthOfYear == minMonth) {
            view.updateDate(minYear, minMonth, minDay);
            //you can add toast message here for min year selection
        } else {
            view.updateDate(year, monthOfYear, dayOfMonth);
        }
    }

};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mPickDate = (Button) findViewById(R.id.pickDate);
    mPickDate.setOnClickListener(this);

    final Calendar c = Calendar.getInstance();
    mYear = c.get(Calendar.YEAR);
    mMonth = c.get(Calendar.MONTH);
    mDay = c.get(Calendar.DAY_OF_MONTH);

    maxYear = mYear - 2;//make a proper condition to change it the based on the   child/infant
    maxMonth = mMonth;
    maxDay = mDay;

    minYear = mYear - 12;//make a proper condition to change it the based on the child/infant
    minMonth = mMonth;
    minDay = mDay;

}

@Override
public void onClick(View v) {
    showDialog(DATE_DIALOG_ID);
}

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
        case DATE_DIALOG_ID:
            return new DatePickerDialog(this, mDateSetListener, mYear - minYear,
                    mMonth, mDay);
    }
    return null;
}

May this help you.愿这对你有帮助。 Better to use dialog fragment since showDialog() of Dialog is deprecated.最好使用对话框片段,因为不推荐使用 Dialog 的showDialog() Also keep in mind it will work only in API Higher than 11. So, change min.sdk in the manifest to 11.还要记住,它仅适用于 API 高于 11。因此,将min.sdk中的min.sdk更改为 11。

Calendar calendar=Calendar.getInstance();
    int mDay = calendar.get(Calendar.DAY_OF_MONTH), mMonth = calendar.get(Calendar.MONTH), mYear = calendar.get(Calendar.YEAR);


    int minDay = calendar.get(Calendar.DAY_OF_MONTH), minMonth = calendar.get(Calendar.MONTH), minYear = calendar.get(Calendar.YEAR)-12;

int maxDay = calendar.get(Calendar.DAY_OF_MONTH), maxMonth = calendar.get(Calendar.MONTH), maxYear = calendar.get(Calendar.YEAR)-12;


public void onDate(View view) {
        System.out.println("hello");
        DialogFragment fragment = new SelectDateFragment();
        fragment.show(getFragmentManager(), "Date Picker");
    }

    class SelectDateFragment extends DialogFragment implements
            DatePickerDialog.OnDateSetListener {

        public Dialog onCreateDialog(Bundle savedInstanceState) {


            System.out.println("entrering on create dialog");;

            return new DatePickerDialog(getActivity(), this, mYear, mMonth,
                    mDay) {

                public void onDateChanged(DatePicker view, int year,
                        int monthOfYear, int dayOfMonth) {
                    System.out.println("----------onDateChanged()-----------"
                            + year + "--" + year);
                    System.out.println("----------onDateChanged()-----------"
                            + monthOfYear + "--" + monthOfYear);
                    System.out.println("----------onDateChanged()-----------"
                            + dayOfMonth + "--" + dayOfMonth);

                    if ((minYear < year)
                            || ((minMonth < monthOfYear) && (minYear == year))
                            || ((minDay < dayOfMonth) && (minYear == year) && (minMonth == monthOfYear))) {
                        view.updateDate(minYear, minMonth - 1, minDay);

                    }

if ((maxYear > year)
                            || ((maxMonth > monthOfYear) && (maxYear == year))
                            || ((maxDay > dayOfMonth) && (maxYear == year) && (maxMonth == monthOfYear))) {
                        view.updateDate(maxYear, maxMonth - 1, maxDay);

                    }

                }
            };

        }

        @Override
        public void onDateSet(android.widget.DatePicker view, int year,
                int monthOfYear, int dayOfMonth) {
            System.out.println("year=" + year + "day=" + dayOfMonth + "month="
                    + monthOfYear);
            mYear=year;
            mMonth=monthOfYear;
            mDay=dayOfMonth;

            onPopulateSet(year, monthOfYear + 1, dayOfMonth);

        }


        private void onPopulateSet(int year, int i, int dayOfMonth) {
            EditText et_setDate;
            et_setDate = (EditText) findViewById(R.id.register_et_dob);
            et_setDate.setText(dayOfMonth + "/" + i + "/" + year);
            System.out.println("enetring on populate Set");

        }

    }
val cal = Calendar.getInstance()
            todayDay = cal.get(Calendar.DAY_OF_MONTH)
            todayMonth = cal.get(Calendar.MONTH)
            todayYear = cal.get(Calendar.YEAR)
            todayHour = cal.get(Calendar.HOUR)
            todayMin = cal.get(Calendar.MINUTE)


            val dpd = DatePickerDialog(this, DatePickerDialog.OnDateSetListener { it, selectedYear, selectedMonth, selectedDay ->
                dateDisplay.isVisible = true
                val selectedDate = "$selectedDay/${selectedMonth + 1}/$selectedYear"
                //Implementing SimpleDateFormat
                val sdf = SimpleDateFormat("dd/mm/yyyy", Locale.ENGLISH)
                val formatedDate = sdf.parse(selectedDate)
                //this variable is of type Date
                val selectedTime = formatedDate!!.time / 60000


                val todayDate = sdf.parse(sdf.format(System.currentTimeMillis()))
                val todayTime = todayDate!!.time / 60000

                dateDisplay.text = formatedDate.toString()
                ageInMins.text = (todayTime - selectedTime).toString()

            }, todayYear, todayMonth, todayDay)
            dpd.datePicker.setMaxDate(Date().time - 86400000)
            dpd.datePicker.setBackgroundColor(Color.RED)
            dpd.show()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM