Диалог TimePicker после нажатия EditText

106

У меня уже есть DatePicker, который появляется, когда пользователь нажимает на поле EditText.

eReminderDate.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //To show current date in the datepicker
                Calendar mcurrentDate = Calendar.getInstance();
                int mYear = mcurrentDate.get(Calendar.YEAR);
                int mMonth = mcurrentDate.get(Calendar.MONTH);
                int mDay = mcurrentDate.get(Calendar.DAY_OF_MONTH);

                DatePickerDialog mDatePicker;
                mDatePicker = new DatePickerDialog(AddReminder.this, new OnDateSetListener() {
                    public void onDateSet(DatePicker datepicker, int selectedyear, int selectedmonth, int selectedday) {
                        // TODO Auto-generated method stub
                    /*      Your code   to get date and time    */
                        selectedmonth = selectedmonth + 1;
                        eReminderDate.setText("" + selectedday + "/" + selectedmonth + "/" + selectedyear);
                    }
                }, mYear, mMonth, mDay);
                mDatePicker.setTitle("Select Date");
                mDatePicker.show();
            }
        });

Я пробовал сделать TimePicker аналогичным образом, но не смог заставить его работать. Это моя попытка заставить его работать

 eReminderTime.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Calendar mcurrentTime = Calendar.getInstance();
                int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);
                int minute = mcurrentTime.get(Calendar.MINUTE);
                TimePickerDialog mTimePicker;
                mTimePicker = new TimePickerDialog(AddReminder.this, new TimePickerDialog.OnTimeSetListener() {
                    @Override
                    public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {
                        eReminderTime.setText( ""selectedHour + ":" + selectedMinute);
                    }
                }, hour, minute);
                mTimePicker.setTitle("Select Time");
                mTimePicker.show();

            }
        });

Неужели нельзя сделать так, как я сделал для DatePicker?

Я пробовал даже просто сделать всплывающее окно TimePicker после того, как щелкнули поле EditText с помощью этого кода.

      eReminderTime.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            showDialog(TIME_DIALOG_ID);
        }
    });

По какой-то причине, когда я ввел это в Android Studio, showDialog был оценен.

Может ли кто-нибудь дать мне подсказку, где я ошибаюсь? Или мне просто нужно использовать Custom DialogFragment?

Марк О'Салливан
источник
Что на самом деле не работает во втором блоке кода? Просто не отображается, не компилируется?
Robadob
Показывает ошибку в части setText между "" и selectedHour, говорит, что требуется ',' или ')', но когда я помещаю ',' он говорит, что "невозможно разрешить метод" setText (java.lang.String, java .lang.String) »
Марк О'Салливан

Ответы:

234
eReminderTime.setText( "" + selectedHour + ":" + selectedMinute);

Вам не хватает +промежутка между ""и выбранным часом, setTextметоды принимают только одну строку, поэтому вам нужно объединить все части (первые кавычки, вероятно, не нужны).

eReminderTime.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Calendar mcurrentTime = Calendar.getInstance();
            int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);
            int minute = mcurrentTime.get(Calendar.MINUTE);
            TimePickerDialog mTimePicker;
            mTimePicker = new TimePickerDialog(AddReminder.this, new TimePickerDialog.OnTimeSetListener() {
                @Override
                public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {
                    eReminderTime.setText( selectedHour + ":" + selectedMinute);
                }
            }, hour, minute, true);//Yes 24 hour time
            mTimePicker.setTitle("Select Time");
            mTimePicker.show();

        }
    });

Это должно исправить вашу вторую ошибку, вы не указали последний параметр. Конструкторы TimePickerDialog

Робадоб
источник
Пытался и думаю, что мог бы попробовать это раньше, потому что я получил это сообщение раньше. Теперь показывает ошибку после «нового TimePickerDialog» и до «mTimePicker.setTitle». Ошибка: «Не удается разрешить конструктор» TimePickerDialog (com.appname.classname, android.app.TimePickerDialog.OnTimeSetListener, int, int) ''
Марк О'Салливан
2
Если вы проверите документацию по Android, вам нужно добавить последний логический параметр, указывающий, длится ли диалог 24 часа или нет. TimePickerDialog (контекст контекста, TimePickerDialog.OnTimeSetListener callBack, int hourOfDay, int minute, логическое is24HourView)
Robadob
Полностью забыл о логическом true / false, видел это раньше, но забыл включить его, когда изменил свой код на что-то похожее на средство выбора даты. Спасибо за вашу помощь!
Марк О'Салливан
3
Огромное спасибо. Вы, вероятно, захотите отформатировать и минуты: eReminderTime.setText (selectedHour + ":" + String.format ("% 02d", selectedMinute));
Стивен Пол
Надеюсь, он будет более полезным и пригодным для повторного использования -> TimePickerUniversal
Pratik Butani
27

Почему бы не писать повторно?

Создайте класс SetTime:

class SetTime implements OnFocusChangeListener, OnTimeSetListener {   

       private EditText editText;
       private Calendar myCalendar;

       public SetTime(EditText editText, Context ctx){
           this.editText = editText;
           this.editText.setOnFocusChangeListener(this);
           this.myCalendar = Calendar.getInstance();

       }

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            // TODO Auto-generated method stub
            if(hasFocus){
                int hour = myCalendar.get(Calendar.HOUR_OF_DAY);
                int minute = myCalendar.get(Calendar.MINUTE);
                new TimePickerDialog(ctx, this, hour, minute, true).show();
            }
        }

        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            // TODO Auto-generated method stub
            this.editText.setText( hourOfDay + ":" + minute);
        }

    }

Затем вызовите его из функции onCreate:

    EditText editTextFromTime = (EditText) findViewById(R.id.editTextFromTime);
    SetTime fromTime = new SetTime(editTextFromTime, this);
Сумоананд
источник
Как добраться до утра / вечера?
Практик Бутани
10

Вы можете использовать приведенный ниже код в прослушивателе onclick для edittext

  TimePickerDialog timePickerDialog = new TimePickerDialog(MainActivity.this,
    new TimePickerDialog.OnTimeSetListener() {

        @Override
        public void onTimeSet(TimePicker view, int hourOfDay,
                              int minute) {

            tv_time.setText(hourOfDay + ":" + minute);
        }
    }, hour, minute, false);
     timePickerDialog.show();

Вы можете увидеть полный код в примере Android timepicker

Рамес
источник
3

Я расширил красивое многоразовое решение @Sumoanand, чтобы поддерживать как изменение фокуса, так и прослушиватели щелчков при изменении времени несколько раз. Также обновление календаря сборщика, чтобы запомнить последнее выбранное время + форматирование ЧЧ: мм

public class TimeSetter implements View.OnFocusChangeListener, TimePickerDialog.OnTimeSetListener, View.OnClickListener {

    private EditText mEditText;
    private Calendar mCalendar;
    private SimpleDateFormat mFormat;

    public TimeSetter(EditText editText){
       this.mEditText = editText;
       mEditText.setOnFocusChangeListener(this);
       mEditText.setOnClickListener(this);
    }

    @Override
    public void onFocusChange(View view, boolean hasFocus) {
        if (hasFocus){
            showPicker(view);
        }
    }

    @Override
    public void onClick(View view) {
        showPicker(view);
    }

    private void showPicker(View view) {
        if (mCalendar == null)
            mCalendar = Calendar.getInstance();

        int hour = mCalendar.get(Calendar.HOUR_OF_DAY);
        int minute = mCalendar.get(Calendar.MINUTE);

        new TimePickerDialog(view.getContext(), this, hour, minute, true).show();
    }

    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        mCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
        mCalendar.set(Calendar.MINUTE, minute);

        if (mFormat == null)
            mFormat = new SimpleDateFormat("HH:mm", Locale.getDefault());

        this.mEditText.setText(mFormat.format(mCalendar.getTime()));
    }

}

Использование onCreate:

EditText timeEditText = (EditText) rootView.findViewById(R.id.timeText);
new TimeSetter(timeEditText);
Питер Бартос
источник
Спасибо за ваше решение :) Я отредактировал его для использования с AM / PM. Проверьте здесь: TimePicker с / без AM / PM
Pratik Butani
2

Я не знаю, сработает ли это для вас, у меня это отлично работает.

Создайте метод для диалогового окна выбора даты / времени.

private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() {

    // when dialog box is called, below method will be called.
    // The arguments will be working to get the Day of Week to show it in a special TextView for it.

    public void onDateSet(DatePicker view, int selectedYear,
                          int selectedMonth, int selectedDay) {
        String year1 = String.valueOf(selectedYear);
        String month1 = String.valueOf(selectedMonth + 1);
        String day1 = String.valueOf(selectedDay);
        delivDate.setText(month1 + "/" + day1 + "/" + year1);
        delivDay.setText(DateFormat.format("EEEE", new Date(selectedYear, selectedMonth, selectedDay - 1)).toString());
    }
};

а потом, где хочешь, ты можешь делать это вот так

public void setDateOnClick (View view) {
    Calendar cal = Calendar.getInstance();

    DatePickerDialog datePicker = new DatePickerDialog(this, datePickerListener,
            cal.get(Calendar.YEAR),
            cal.get(Calendar.MONTH),
            cal.get(Calendar.DAY_OF_MONTH));
    //Create a cancel button and set the title of the dialog.
    datePicker.setCancelable(false);
    datePicker.setTitle("Select the date");
    datePicker.show();
}

надеюсь, вы найдете это своим решением.

Миг Агирре
источник
Мне нравятся две строчки: «// Создать кнопку отмены [...]» и «datePicker.setCancelable (false);» hue hue hue
MojioMS
Я думаю, что этот вопрос не имеет отношения к вопросу.
Pratik Butani
1

Вы не добавили последний аргумент в TimePickerDialog .

{
public TimePickerDialog(Context context, OnTimeSetListener listener, int hourOfDay, int minute,
            boolean is24HourView) {
        this(context, 0, listener, hourOfDay, minute, is24HourView);
    }
}

это код TimePickerclass. требуется логический аргументis24HourView

Swati
источник
0
public void onClick1(View v) {
  DatePickerDialog dialog = new DatePickerDialog(this, this, 2013, 2, 18);
  dialog.show();
}

public void onDateSet1(DatePicker view, int year1, int month1, int day1) {
  e1.setText(day1 + "/" + (month1+1) + "/" + year1);
}
Вирендра Сингх Деора
источник
7
Пожалуйста, не размещайте просто код; объясните, что делает ваш код и почему он решает проблему OP.
dimo414 03
0
public class **Your java Class** extends ActionBarActivity implements  View.OnClickListener{
date = (EditText) findViewById(R.id.date);
date.setInputType(InputType.TYPE_NULL);
        date.requestFocus();
        date.setOnClickListener(this);
        dateFormatter = new SimpleDateFormat("yyyy-MM-dd", Locale.US);

        setDateTimeField();

private void setDateTimeField() {
        Calendar newCalendar = Calendar.getInstance();
        fromDatePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {

            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                Calendar newDate = Calendar.getInstance();
                newDate.set(year, monthOfYear, dayOfMonth);
                date.setText(dateFormatter.format(newDate.getTime()));
            }

        }, newCalendar.get(Calendar.YEAR), newCalendar.get(Calendar.MONTH), newCalendar.get(Calendar.DAY_OF_MONTH));

    }
@Override
    public void onClick(View v) {
        fromDatePickerDialog.show();
    }
}
Jezrel Jumwa
источник
Некоторая дополнительная информация об этом ответе только на код, вероятно, была бы полезна.
Pyves
0

Для меня диалогов появляется более одного, если я щелкаю текст редактирования dpFlightDate более одного раза для диалогового окна Timmer. как я могу избежать появления этого диалогового окна только один раз, и если пользователь щелкнет второй раз, диалоговое окно не должно появиться снова, т.е. если диалоговое окно отображается на экране?

          // perform click event on edit text
            dpFlightDate.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // calender class's instance and get current date , month and year from calender
                    final Calendar c = Calendar.getInstance();
                    int mYear = c.get(Calendar.YEAR); // current year
                    int mMonth = c.get(Calendar.MONTH); // current month
                    int mDay = c.get(Calendar.DAY_OF_MONTH); // current day
                    // date picker dialog
                    datePickerDialog = new DatePickerDialog(frmFlightDetails.this,
                            new DatePickerDialog.OnDateSetListener() {
                                @Override
                                public void onDateSet(DatePicker view, int year,
                                                      int monthOfYear, int dayOfMonth) {
                                    // set day of month , month and year value in the edit text
                                    dpFlightDate.setText(dayOfMonth + "/"
                                            + (monthOfYear + 1) + "/" + year);

                                }
                            }, mYear, mMonth, mDay);
                    datePickerDialog.show();
                }
            });
            tpFlightTime.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // Use the current time as the default values for the picker
                    final Calendar c = Calendar.getInstance();
                    int hour = c.get(Calendar.HOUR_OF_DAY);
                    int minute = c.get(Calendar.MINUTE);
                    // Create a new instance of TimePickerDialog
                    timePickerDialog = new TimePickerDialog(frmFlightDetails.this, new TimePickerDialog.OnTimeSetListener() {
                        @Override
                        public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {
                            tpFlightTime.setText( selectedHour + ":" + selectedMinute);
                        }
                    }, hour, minute, true);//Yes 24 hour time
                    timePickerDialog.setTitle("Select Time");
                    timePickerDialog.show();
                }
            });
Джерри Абрахам
источник