web-dev-qa-db-ja.com

AndroidのDatePickerDialogに制限を設定しますか?

DatePickerDialogを制限して、過去2〜12年または現在の日付から0〜2年の日付を選択する方法

アクティビティにDatePickerDialogがあり、これは子供と幼児の誕生日を取得するために使用されます。子供の年齢は(2〜12歳)で、幼児の年齢は(0〜2歳)です。 1を渡すと、年齢制限は(2〜12歳)になり、2を渡すと、年齢制限は(0〜2歳)になります。

カレンダーでこの機能を使用するにはどうすればよいですか?

私のカレンダーコードは:

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

他のすべての答えはかなり複雑に見えるので、私はただ明白なことを述べるつもりです:DatePickerから基礎となるDatePickerDialogを取得できます(単に getDatePicker() )そして次を使用してその境界を設定します:

引数は、デフォルトのタイムゾーンの1970年1月1日00:00:00からの通常のミリ秒数です。もちろん、これらの値を計算する必要がありますが、それはCalendarクラスで行うのは簡単です。現在の日付を取得し、x年を加算または減算するだけです。

より注意深い読者は、前述のセッターがAPIレベル11まで利用できなかったことに気付くでしょう。その(またはより新しい)プラットフォームのみをターゲットにしている場合は、準備ができています。ジンジャーブレッドデバイス(Android 2.3/APIレベル9以降)もサポートする場合は、代わりに バックポートバージョンのDatePicker を使用できます。

167
MH.

DatePickerDialogの最小日付と最大日付を設定するだけでは不十分です。ユーザーは年をクリックして、年の間をスクロールできます。

また、DatePickerで次のように年の範囲を設定する必要があります。

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

私はツアーに参加していて、PCにアクセスできなかったため、動作するコードを提供する立場にありません。しかし、私はあなたにあなたの目的を達成する方法を与えることができます(またはそう思う)。

これが完全に機能するかどうかはわかりませんが、試してみる価値はあります。

Plsはこのコードを試して、私に知らせてください。

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

    }
};
1
Arun Shankar

これがあなたを助けますように。 DialogのshowDialog()は廃止されているため、ダイアログフラグメントを使用することをお勧めします。また、11以上のAPIでのみ機能することに注意してください。したがって、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");

        }

    }
1
Harsh Parikh
    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;
}
}
0
Teraiya Mayur

これが作業コードです。コードに応じていくつかの変更を行う必要があります。子供や幼児の最低年齢と最高年齢を追加できるように。

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;
}
0
Shakeeb Ayaz