1

У меня есть простой DatePickerDialog, который открывается, когда открывается EditText. После выбора даты и нажатия OK, она должна отображаться на том же EditText. Он отлично работает, если я использую только диалог по умолчанию, где он создает только одну кнопку - ОК. Я добавил кнопку «Отмена», проблема в том, что она получает только текущую дату.DatePickerDialog OK кнопка не получает выбранную дату

Вот мой код:

private void showDatePicker(String birthdayStr) { 
     // TODO Auto-generated method stub 
     final Calendar c = Calendar.getInstance(); 

     if (birthdayStr.equals("")) { 
      yearStr = c.get(Calendar.YEAR); 
      monthStr = c.get(Calendar.MONTH); 
      dayStr = c.get(Calendar.DAY_OF_MONTH); 
     } 

     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) { 
       if (isOkayClicked) { 
        birthday.setText(selectedYear + (selectedMonth + 1) + selectedDay); 
        yearStr = selectedYear; 
        monthStr = selectedMonth; 
        dayStr = selectedDay; 
       } 
       isOkayClicked = false; 
      } 
     }; 
     DatePickerDialog datePickerDialog = new DatePickerDialog(
       RegistrationTwoActivity.this, datePickerListener, yearStr, 
       monthStr, dayStr); 

     datePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, 
       getString(R.string.cancel), 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         if (which == DialogInterface.BUTTON_NEGATIVE) { 
          dialog.cancel(); 
          isOkayClicked = false; 
         } 
        } 
       }); 

     datePickerDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         if (which == DialogInterface.BUTTON_POSITIVE) { 
          isOkayClicked = true; 
          birthday.setText(selectedYear + (selectedMonth + 1) + selectedDay); 
         } 
        } 
       }); 
     datePickerDialog.setCancelable(false); 
     datePickerDialog.show(); 
    } 

Если удалить строку birthday.setText(selectedYear + (selectedMonth + 1) + selectedDay); под OK или BUTTON_POSITIVE, он отлично работает. Но на некоторых устройствах он не устанавливает выбранную дату в EditText, так как она была вызвана только внутри datePickerListener. Поэтому я решил добавить строку birthday.setText(selectedYear + (selectedMonth + 1) + selectedDay); под OK или BUTTON_POSITIVE, но теперь проблема в том, что она получает только текущую дату.

Я немного смущен этим. Если бы кто-то мог мне помочь.

ответ

8

Внести следующие изменения в коде

final 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) { 
         if (isOkayClicked) { 
          birthday.setText(selectedYear + (selectedMonth + 1) 
            + selectedDay); 
          yearStr = selectedYear; 
          monthStr = selectedMonth; 
          dayStr = selectedDay; 
         } 
         isOkayClicked = false; 
        } 
       }; 
       final DatePickerDialog datePickerDialog = new DatePickerDialog(
         RegistrationTwoActivity.this, datePickerListener, 
         yearStr, monthStr, dayStr); 

       datePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, 
         getString(R.string.cancel), 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, 
            int which) { 
           if (which == DialogInterface.BUTTON_NEGATIVE) { 
            dialog.cancel(); 
            isOkayClicked = false; 
           } 
          } 
         }); 

       datePickerDialog.setButton(DialogInterface.BUTTON_POSITIVE, 
         "OK", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, 
            int which) { 
           if (which == DialogInterface.BUTTON_POSITIVE) { 
            isOkayClicked = true; 
            DatePicker datePicker = datePickerDialog 
              .getDatePicker(); 
            datePickerListener.onDateSet(datePicker, 
              datePicker.getYear(), 
              datePicker.getMonth(), 
              datePicker.getDayOfMonth()); 
           } 
          } 
         }); 
       datePickerDialog.setCancelable(false); 
       datePickerDialog.show(); 

Для работы этого кода, вы должны изменить свой minSdkVersion на по крайней мере 11 в манифесте , Надеюсь, это вам поможет .. :)

+0

Большое вам спасибо за это, потребовалось столько времени, чтобы ответить, но это сработало. Я знал, что должен получить эти значения из 'datePickerListener', я просто не знал, как использовать глобальные переменные. –

-1

Попробуйте вызвать datePickerDialog.getDatePicker().clearFocus() в начале метода OnClick:

final DatePickerDialog datePickerDialog = ... 
    ... 

    datePickerDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        datePickerDialog.getDatePicker().clearFocus(); 
        isOkayClicked = true; 
        birthday.setText(selectedYear + (selectedMonth + 1) + selectedDay); 
       } 
      }); 
Смежные вопросы