7

Tôi tìm thấy DatePicker (Dialog) rất khó hiểu ... Khi setMinDate() được đặt ... lịch hiển thị thực sự "vô hiệu hóa" ngày đã qua (biến chúng thành màu xám) nhưng những ngày này vẫn có thể chọn được! Tôi muốn người dùng ngăn chặn để làm như vậy. Cách lý tưởng sẽ được thực hiện qua ngày không thể nhấp/không thể chọn. Nếu nó không thể, ít nhất là bắt sự kiện này (cái nào? OnDateChanged ?, onSelected? ...) và nướng một tin nhắn và tắt nút OK cho đến khi người dùng chọn một ngày hợp lệ.Làm thế nào để ngăn ngày được chọn trong DatePickerDialog (setMinDate không hoạt động như mong đợi)

Unfortunatelly, datepicker (hộp thoại) không có onChangedListener (thực sự nó có nhưng không có setter cho nó). Vì vậy, sự kiện duy nhất tôi nhận được là nhấn nút OK. Quá muộn rồi.

Đây là mã của tôi

dateTextView = (TextView) view.findViewById(R.id.createOrder_date); 
    dateTextView.setText(R.string.createOrder_time_now); 
    dateTextView.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      final Calendar calendarNow = Calendar.getInstance(); 
      final int yearNow = calendarNow.get(Calendar.YEAR); 
      final int monthNow = calendarNow.get(Calendar.MONTH); 
      final int dayNow = calendarNow.get(Calendar.DAY_OF_MONTH); 

      DatePickerDialog datePickerDialog = new DatePickerDialog(CreateOrderFragment.this.getActivity(), new DatePickerDialog.OnDateSetListener() { 
       @Override 
       public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
        Calendar calendar = Calendar.getInstance(); 
        calendar.set(year, monthOfYear, dayOfMonth); 

        if (calendar.before(calendarNow)) { 
         Toast.makeText(CreateOrderFragment.this.getActivity(), getResources().getString(R.string.createOrder_datePicker_selectFutureDate), Toast.LENGTH_SHORT).show(); 
         view.updateDate(yearNow, monthNow, dayNow); 
         calendar = calendarNow; 
        } 

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
        dateTextView.setText(sdf.format(calendar.getTime())); 
       } 
      }, yearNow, monthNow, dayNow); 

      datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000); 
      datePickerDialog.setTitle(getResources().getString(R.string.createOrder_datePicker_title)); 
      datePickerDialog.show(); 

     } 
    }); 

enter image description here

+0

'SimpleDateFormat sdf = SimpleDateFormat mới ("dd/MM/yyyy"); ' \t \t' ngày minDate = null;' \t \t 'try {' \t \t \t 'minDate = sdf.parse ("01/01/2014"); ' \t \t '} catch (ParseException e) {' \t \t \t 'e.printStackTrace();' \t \t \t' trở lại; ' \t '\t}' 01. ::: Tôi đã làm điều đó bằng cách sử dụng tính năng này. ** LƯU Ý: ** Dành cho API cấp 9 trở lên –

+0

Bạn đã bao giờ tìm thấy giải pháp cho điều này chưa? – jlindenbaum

+0

unfortunatelly không. – Wooff

Trả lời

1

Khi bạn nhận được ngày trong onDateSent(), chỉ cần kiểm tra nếu nó sớm hơn ngày bạn đã đặt trong setMinDate(). Nếu vậy, sau đó chỉ hiển thị DatePickerDialog một lần nữa.

Code:

final long tomorrow = System.currentTimeMillis() + DateUtils.MILLIS_IN_DAY; 

private void showDatePickerDialog() 
{ 
    mDatePickerDialog = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() 
    { 
     @Override 
     public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) 
     { 
      Calendar calendar = Calendar.getInstance(); 
      calendar.set(year, monthOfYear, dayOfMonth); 

      //kv If user tries to select date in past (or today) 
      if (calendar.getTimeInMillis() < tomorrow) 
      { 
       //kv Make them try again 
       showDatePickerDialog(); 

       Toast.makeText(this, "Invalid date, please try again", Toast.LENGTH_LONG).show(); 
      } 
      else 
      { 
       //success 
      } 
     } 
    }, calendarTwoWeeksInFuture.get(Calendar.YEAR), calendarTwoWeeksInFuture.get(Calendar.MONTH), calendarTwoWeeksInFuture.get(Calendar.DAY_OF_MONTH)); 

    //kv Set minimum date as tomorrow 
    mDatePickerDialog.getDatePicker().setMinDate(tomorrow); 

    mDatePickerDialog.show(); 
} 
+0

Unfortunatelly, nó không phải là rất thân thiện với người dùng. Nó không giải quyết vấn đề mà nó cho phép người dùng chọn ngày không hợp lệ. Giải pháp phải là ngày không hợp lệ không thể chọn được. Hoặc bằng giao diện người dùng (ngày đó không thể chọn) hoặc hành động ngay lập tức (sau khi người dùng chọn ngày không hợp lệ - thông báo xác thực được hiển thị (bánh mì nướng?) Và chọn ngày hợp lệ cuối cùng được chọn). – Wooff

+0

Tôi biết nó không phải là giải pháp ý tưởng, nhưng nó hoạt động. Nó không cho phép người dùng tiếp tục và hiển thị một Bánh mì nướng nếu ngày được chọn không hợp lệ. –

0

tôi đã được tìm kiếm một thời gian và có vẻ như là không có cách nào để làm điều đó trong datePickerDialog mới (hơn 5), bạn có thể xử lý nó cho mình bằng cách thay trả lại min/giá trị tối đa từ khi nhấp chuột hoặc bằng cách mở lại hộp thoại, tính năng này sẽ được phát triển ngay bây giờ.

Các vấn đề liên quan