2

Я применяю следующий код для текста редактирования, чтобы выбрать дату.предотвратить выбор прошлых дат в timePicker DialogFragment

public class DatePickerFragment extends DialogFragment 
{ 

    private OnDateSetListener listener; 

    public DatePickerFragment(OnDateSetListener listener) 
    { 
     this.listener = listener; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     final Calendar c = Calendar.getInstance(); 
     int year = c.get(Calendar.YEAR); 
     int month = c.get(Calendar.MONTH); 
     int day = c.get(Calendar.DAY_OF_MONTH); 

     return new DatePickerDialog(getActivity(), listener, year, month, day); 
    } 
} 

@Override 
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) 
{ 
    //do some stuff 
} 

void showDateDialog() 
{ 
    DatePickerFragment newFragment = new DatePickerFragment(this); 
    newFragment.show(getFragmentManager(), "date_picker"); 
} 

Однако, я хочу, чтобы серые все прошлые даты, чтобы пользователю не разрешалось выбирать ни одно из них. Это возможно с помощью кода? Или я должен вручную проверить, является ли дата прошедшей датой после выбора?

ответ

10

Использование setMinDate() функция. Он устанавливает минимальную дату в миллисекундах с 1 января 1970 года 00:00:00 в getDefault() часовом поясе. Установите минимальную дату на сегодняшнюю дату, чтобы пользователь не смог пройти мимо нее. Нечто подобное следующее onCreateDialog:

final Calendar c = Calendar.getInstance(); 
int year = c.get(Calendar.YEAR); 
int month = c.get(Calendar.MONTH); 
int day = c.get(Calendar.DAY_OF_MONTH); 

DatePickerDialog d = new DatePickerDialog(getActivity(), listener, year, month, day); 
DatePicker dp = d.getDatePicker(); 
dp.setMinDate(c.getTimeInMillis()); 
return d; 
+1

после почти завершающего года, да, это лучший ответ! Я не знаю, почему это все еще не поддержано. – ElaGorilaki

+2

Я не думаю, что решение предназначено для работы с фрагментами, я могу ошибаться. –

+0

как справиться с этим в случае фрагмента диалога? – CoDe

0

Использование и DatePicker.setMinDate() установить фиксированный год.

например.

Calendar c_max = Calendar.getInstance(), 
Calendar c_min = Calendar.getInstance(); 

c_min.set(2012,0,1); // your min date boundary 
c_max.set(2013,11,31); // your max date boundary 

DatePicker.setMaxDate(c_max.getTimeInMillis()); 
DatePicker.setMinDate(c_min.getTimeInMillis()); 

Как setMaxDate() и setMinDate() были добавлены из API 11, вы можете сделать это следующим образом для более низких версий.

Вы можете установить диапазон с помощью метода date datePicker.

// Calendar 
this.calendar = new GregorianCalendar(); 
this.datePicker = (DatePicker) findViewById(R.id.your_datepicker_id); 

// check for the build version 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    // (picker is a DatePicker- set current time as min time. 
    this.datePicker.setMinDate(this.calendar.getTimeInMillis()); 
} else { 
    final int minYear = this.calendar.get(Calendar.YEAR); 
    final int minMonth = this.calendar.get(Calendar.MONTH); 
    final int minDay = this.calendar.get(Calendar.DAY_OF_MONTH); 

    this.datePicker.init(minYear, minMonth, minDay, 
      new OnDateChangedListener() { 

       public void onDateChanged(DatePicker view, int year, 
         int month, int day) { 
        Calendar newDate = Calendar.getInstance(); 
        newDate.set(year, month, day); 

        if (calendar.after(newDate)) { 
         view.init(minYear, minMonth, minDay, this); 
        } 
       } 
      });  
} 
+0

Вы не можете позвонить DatePicker datePicker = datePickerDialog.getDatePicker(); для api <11. Таким образом, ваше решение, похоже, не работает для api <11 – jaxvy

1
date button on clcik method 

    dateButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       showDialog(DATE_DIALOG_ID); 


      } 
     }); 


for date piker create dialog method : 

case DATE_DIALOG_ID: 
      { 

       Calendar calendar = Calendar.getInstance(); 
       final DatePickerDialog dojDPDilog = new DatePickerDialog(this,datePickerListener,calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE)); 
        dojDPDilog.setTitle("Select Date"); 
       try { 
        java.lang.reflect.Field mDatePickerField = dojDPDilog.getClass().getDeclaredField("mDatePicker"); 
        mDatePickerField.setAccessible(true); 
        try { 
         dojDPicker = (DatePicker) mDatePickerField.get(dojDPDilog); 
        } catch (IllegalArgumentException e) { 
         e.printStackTrace(); 
        } catch (IllegalAccessException e) { 
         e.printStackTrace(); 
        } 
       } catch (NoSuchFieldException e) { 
        e.printStackTrace(); 
       } 

       dojDPicker.init(minYear, minMonth, minDay,new OnDateChangedListener() { 
          @Override 
          public void onDateChanged(DatePicker view, int year,int monthOfYear, int dayOfMonth) { 
           disableDate(view, year, monthOfYear, dayOfMonth); 
           } 


         }); 
       return dojDPDilog; 
      } 


for disable method: 


     private void disableDate(DatePicker view, int year,int monthOfYear, int dayOfMonth) { 

      if (year > maxYear) 
      { 
       view.updateDate(maxYear, maxMonth, maxDay); 
      } 
      else if (monthOfYear > maxMonth && year == maxYear) 
      { 
       view.updateDate(maxYear, maxMonth, maxDay); 
      } 
     else if (dayOfMonth > maxDay && year == maxYear && monthOfYear == maxMonth) 
      { 
       view.updateDate(maxYear, maxMonth, maxDay); 
      } 
      else if (year < minYear) 
      { 
       view.updateDate(minYear, monthOfYear, dayOfMonth); 
      } 
      else if (monthOfYear < minMonth && year == minYear) 
      { 
       view.updateDate(minYear, minMonth, dayOfMonth); 
      } 
     else if (dayOfMonth < minDay && year == minYear && monthOfYear == minMonth) 
      { 
       view.updateDate(minYear, minMonth, minDay); 
      } 
     } 



      and take local variables: 

     int maxYear = c.get(Calendar.YEAR) + 100; 
    int maxMonth = c.get(Calendar.MONTH); 
    int maxDay = c.get(Calendar.DAY_OF_MONTH); 

    int minYear = c.get(Calendar.YEAR); 
    int minMonth = c.get(Calendar.MONTH); 
    int minDay = c.get(Calendar.DAY_OF_MONTH); 
0

Эй попробовать это в методе onDateSet(). Это работает над фрагментами.

Calendar calendar1 = Calendar.getInstance(); 
calendar1.set(2014,11-1,11); 
view.setMinDate(calendar1.getTimeInMillis()-10000); 
Смежные вопросы