2013-08-16 130 views
28

如何限制DatePickerDialog選擇過去2至12年的日期和從當前日期起0至2年的日期。我有用於獲取兒童和嬰兒的出生日期的活動中的DatePickerDialog。兒童年齡將是(2-12歲),嬰兒年齡可以是(0-2歲)。所以我能做些什麼才能在我的日曆中獲得這個功能。如果我通過1,那麼年齡限制將是(2-12歲),我通過2年齡限制將是(0-2歲)。請幫助獲得我的功能壓延機。在Android中設置DatePickerDialog的限制?

日曆代碼是:

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

是不是mayur的答案幫助你?這似乎很好的工作.. –

+0

呃。必須使其動態..我的代碼是靜態的,我想使其動態,所以我通過的價值和限制將在兒童和嬰兒日曆設置 – Developer

+0

忙於我的項目..抱歉..稍後會抓到你。 :/ –

回答

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

我不是在一個位置,讓您的工作代碼,因爲我是一個旅遊和無法訪問我的電腦。但我可以給你一個方法來實現你的目標(或者我認爲)。

我不確定這會完美工作,但任何方式值得一試。

請嘗試此代碼並通知我。

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

    } 
}; 
0

這是工作代碼,您必須根據您的代碼做一些更改。就像你可以添加兒童和嬰兒的最小和最大年齡。

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

我還在更新等待 –

+0

我的代碼中有什麼變化 – Developer

+0

@ Gauravnow我的ans是完整的..添加一個條件來改變maxging和minyear基於兒童和嬰兒oncreate() –

127

所有其他的答案似乎頗爲曲折,所以我只是不言自明的:你可以從一個DatePickerDialog得到根本DatePicker(通過簡單地調用getDatePicker()),並利用設置在其邊界:

凡的說法是通常NUM默認時區1970年1月1日00:00:00以來的毫秒數。當然,您仍然必須計算這些值,但對於Calendar課程來說,這應該是微不足道的:只需取當前日期並添加或減去x年。

更加細心的讀者會注意到,上述設置工具直到API級別11纔可用。如果您只是針對那個(或更新的)平臺,那麼您就很好。如果您還想支持Gingerbread設備(Android 2.3/API等級9+),則可以使用backported version of DatePicker替代。

+0

該項目可以爲我節省過去的日子。很高興知道! – longilong

+4

這就是做到這一點的方式:http://stackoverflow.com/questions/13661788/how-to-set-minimum-datepicker-date-to-current-date – itzhar

+0

謝謝你的答案。 – user1510006

1

這可以幫助你。更好的使用對話框片段,因爲Dailog的showDialog()被刪除。 另外,請記住,將工作只能在API比11.so,在清單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"); 

     } 

    } 
0

如果你不想使用自定義對話框,然後用這個單行代碼

datePickerDialog.getDatePicker()。setMinDate(System。的currentTimeMillis());

1

設置DatePickerDialog的最小和最大日期是不夠的。用戶可以點擊年份並在幾年之間滾動。

您還應該設置年份範圍上的DatePicker這樣的:

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

我有不同的問題。

我使用兩個輸入文本和兩個DatePickerDialog,我需要更新在第一個日期選擇器對話框中選擇的動作的第二個動作,但由於我在第一個對話框中選擇了第二個對話框中的minDate未更新。

參考:

SetMax date to 30 days in Android Date Picker

現在,正下方,啓動變量:

private static final int DEPARTUREDATE_DIALOG_ID = 0; 
private static final int RETURNDATE_DIALOG_ID = 1; 

private long mMinReturnDate; 
private int year_x, month_x, day_x; 

的正下方,默認值和第一日期選擇器對話框中的minDate:

// onCreate setValues() method. 
DateFormat dateFormat = new SimpleDateFormat("EE, dd MMM yyyy", Locale.getDefault()); 

Calendar calendar = Calendar.getInstance(); 

year_x = calendar.get(Calendar.YEAR); 
month_x = calendar.get(Calendar.MONTH); 
day_x = calendar.get(Calendar.DAY_OF_MONTH); 

String departureDatetime = dateFormat.format(calendar.getTime()); 
mDepartureDate.setText(departureDatetime); 

// Determine min date to select in calendar. 
mMinReturnDate = calendar.getTimeInMillis(); 

calendar.add(Calendar.DATE, 1); 

String returnDatetime = dateFormat.format(calendar.getTime()); 
mReturnDate.setText(returnDatetime); 

onCreateDialog方法:

protected Dialog onCreateDialog(int id) { 
    super.onCreateDialog(id); 

    if (id == DEPARTUREDATE_DIALOG_ID) 
     return showCalendarFromDepartureDate(mContext, year_x, month_x, day_x); 

    else if (id == RETURNDATE_DIALOG_ID) 
     return showCalendarFromReturnDate(mContext, year_x, month_x, day_x); 

    return null; 
} 

正下方showCalendarFromDepartureDate方法:

在這裏,我做了代碼更新第二日期選擇器對話框的minDate曾經是我選擇的第一個對話框。

/** 
* Show calendar from departure date. 
* 
* @param context 
* @param year 
* @param month 
* @param day 
* @return 
*/ 
protected DatePickerDialog showCalendarFromDepartureDate(Context context, int year, int month, int day) { 
    Calendar now = Calendar.getInstance(); 

    DatePickerDialog dialog = new DatePickerDialog(context, departureDatePickerLstner, year, month, day); 
    dialog.getDatePicker().setMinDate(now.getTimeInMillis()); 

    return dialog; 
} 

private DatePickerDialog.OnDateSetListener departureDatePickerLstner = new DatePickerDialog.OnDateSetListener() { 
    @Override 
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { 
     DateFormat dateFormat = new SimpleDateFormat("EE, dd MMM yyyy", Locale.getDefault()); 

     year_x = year; 
     month_x = month; 
     day_x = dayOfMonth; 

     Calendar newDate = Calendar.getInstance(); 
     newDate.set(year_x, month_x, day_x); 

     // Update minDate to date of return. 
     mMinReturnDate = newDate.getTimeInMillis(); 

     String departureDatetime = dateFormat.format(newDate.getTime()); 
     mDepartureDate.setText(departureDatetime); 

     newDate.add(Calendar.DATE, 1); 

     String returnDatetime = dateFormat.format(newDate.getTime()); 
     mReturnDate.setText(returnDatetime); 
    } 
}; 

的問題是我第二次更新的第一個日曆日期,第二的minDate總是很舊日期第一次我選擇了它。

/** 
* Show calendar from return date. 
* 
* @param context 
* @param year 
* @param month 
* @param day 
* @return 
*/ 
protected DatePickerDialog showCalendarFromReturnDate(Context context, int year, int month, int day) { 
    DatePickerDialog dialog = new DatePickerDialog(context, returnDatePickerLstner, year, month, day); 
    dialog.getDatePicker().setMinDate(mMinReturnDate); 

    return dialog; 
} 

private DatePickerDialog.OnDateSetListener returnDatePickerLstner = new DatePickerDialog.OnDateSetListener() { 
    @Override 
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { 
     DateFormat dateFormat = new SimpleDateFormat("EE, dd MMM yyyy", Locale.getDefault()); 

     year_x = year; 
     month_x = month; 
     day_x = dayOfMonth; 

     Calendar newDate = Calendar.getInstance(); 
     newDate.set(year_x, month_x, day_x); 

     String returnDatetime = dateFormat.format(newDate.getTime()); 
     mReturnDate.setText(returnDatetime); 
    } 
}; 

第一個對話框中選擇日期

Select date in the first dialog

選擇日期在第二個對話框

now select date in the second dialog

更新日期第一個對話框

enter image description here

在這裏,在第二個對話框

date of the second dialog

日期的bug。編輯:我懷疑DatePickerDialog是不是每次我點擊輸入時創建的,所以我決定調試第二個日期選擇器對話框showCalendarFromReturnDate()的方法,它並不總是在這裏發生。

在我的最後一個方法onDataSet()辦法,因爲在開始對話,也沒有通過該方法去之前刪除的對話框removeDialog (RETURNDATE_DIALOG_ID);但即使如此,有時的minDate沒有設置添加第二個日期選擇器對話框的聽衆。

我不知道該怎麼做。

@Override 
protected Dialog onCreateDialog(int id) { 
    super.onCreateDialog(id); 

    if (id == DEPARTUREDATE_DIALOG_ID) 
     return showCalendarFromDepartureDate(mContext, year_x, month_x, day_x); 

    else if (id == RETURNDATE_DIALOG_ID) 
     return showCalendarFromReturnDate(mContext, year_x, month_x, day_x); 

    return null; 
} 

... 


protected DatePickerDialog showCalendarFromReturnDate(Context context, int year, int month, int day) { 
    Log.d(TAG, "==== DatePickerDialog from returnDate ===="); 
    Log.d(TAG, "minDate is: " + mMinReturnDate); 
    Log.d(TAG, "year is: " + year); 
    Log.d(TAG, "month is: " + month); 
    Log.d(TAG, "day is: " + day); 

    DatePickerDialog dialog = new DatePickerDialog(context, returnDatePickerLstner, year, month, day); 
    dialog.getDatePicker().setMinDate(mMinReturnDate); 

    return dialog; 
} 

private DatePickerDialog.OnDateSetListener returnDatePickerLstner = new DatePickerDialog.OnDateSetListener() { 
    @Override 
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { 
     DateFormat dateFormat = new SimpleDateFormat("EE, dd MMM yyyy", Locale.getDefault()); 

     year_x = year; 
     month_x = month; 
     day_x = dayOfMonth; 

     Calendar newDate = Calendar.getInstance(); 
     newDate.set(year_x, month_x, day_x); 

     String returnDatetime = dateFormat.format(newDate.getTime()); 
     mReturnDate.setText(returnDatetime); 

     //@TODO: I try to resolve this bug with this but it doesn't always work. 
     removeDialog(RETURNDATE_DIALOG_ID); 
    } 
}; 

發生了什麼傢伙?