TimePicker Dialog dari mengklik EditText

106

Saya sudah mendapatkan DatePicker yang muncul ketika pengguna mengklik bidang 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();
            }
        });

Saya sudah mencoba melakukan TimePicker dengan cara yang sama tetapi tidak dapat membuatnya berfungsi. Ini adalah usaha saya untuk membuatnya bekerja

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

            }
        });

Apakah tidak mungkin melakukannya seperti yang saya lakukan untuk DatePicker?

Saya sudah mencoba bahkan hanya membuat TimePicker muncul setelah bidang EditText diklik dengan kode ini.

      eReminderTime.setOnClickListener(new OnClickListener() {

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

Untuk beberapa alasan ketika saya memasukkannya ke dalam Android Studio, 'showDialog' telah dicetak.

Adakah yang bisa memberi saya tip tentang kesalahan yang saya alami? Atau apakah saya hanya harus menggunakan DialogFragment Kustom?

Mark O'Sullivan
sumber
Apa yang sebenarnya tidak berfungsi di blok kode kedua Anda ?, tidak muncul begitu saja, bukan dikompilasi?
Robadob
Menunjukkan kesalahan pada bagian setText antara "" dan selectedHour, mengatakan ',' atau ')' diperlukan tetapi ketika saya meletakkan ',' dikatakan "tidak dapat menyelesaikan metode 'setText (java.lang.String, java .lang.String) "
Mark O'Sullivan

Jawaban:

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

Anda kehilangan +antara ""dan jam yang dipilih, setTextmetode hanya mengambil satu string, jadi Anda perlu menggabungkan semua bagian (tanda kutip pertama mungkin tidak diperlukan).

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

        }
    });

Itu seharusnya memperbaiki kesalahan kedua Anda, Anda tidak memberikan parameter terakhir. Pembuat TimePickerDialog

Robadob
sumber
Mencoba itu dan berpikir saya mungkin akan mencobanya sebelumnya karena saya mendapat pesan ini sebelumnya. Sekarang menampilkan semua kesalahan setelah 'TimePickerDialog baru' dan sebelum 'mTimePicker.setTitle'. Kesalahannya adalah 'Tidak dapat menyelesaikan konstruktor' TimePickerDialog (com.appname.classname, android.app.TimePickerDialog.OnTimeSetListener, int, int) ''
Mark O'Sullivan
2
Jika Anda memeriksa dokumentasi android, Anda perlu menambahkan parameter boolean terakhir yang menyatakan apakah dialog tersebut 24 jam atau tidak. TimePickerDialog (Konteks konteks, TimePickerDialog.OnTimeSetListener callBack, int hourOfDay, int menit, boolean is24HourView)
Robadob
Benar-benar lupa tentang boolean benar / salah, melihatnya sebelumnya tetapi lupa memasukkannya ketika saya mengubah kode saya ke sesuatu yang mirip dengan pemilih tanggal. Terima kasih atas bantuan Anda!
Mark O'Sullivan
3
Keren terima kasih. Anda mungkin ingin memformat menit juga: eReminderTime.setText (selectedHour + ":" + String.format ("% 02d", selectedMinute));
Stephen Paul
Saya berharap ini akan lebih berguna dan dapat digunakan kembali -> TimePickerUniversal
Pratik Butani
27

Mengapa tidak menulis dengan cara yang dapat digunakan kembali?

Buat kelas 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);
        }

    }

Kemudian panggil dari fungsi onCreate:

    EditText editTextFromTime = (EditText) findViewById(R.id.editTextFromTime);
    SetTime fromTime = new SetTime(editTextFromTime, this);
Sumoanand
sumber
Bagaimana cara mendapatkan AM / PM?
Pratik Butani
10

Anda dapat menggunakan kode di bawah ini di onclick listener dari 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();

Anda dapat melihat kode lengkapnya di contoh Timepicker Android

Ramees
sumber
3

Saya memperluas solusi bagus yang dapat digunakan kembali dari @Sumoanand untuk mendukung perubahan fokus dan pendengar klik saat mengubah waktu beberapa kali. Juga memperbarui kalender pemilih untuk mengingat waktu yang dipilih terakhir + pemformatan HH: mm

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

}

Penggunaan dari onCreate:

EditText timeEditText = (EditText) rootView.findViewById(R.id.timeText);
new TimeSetter(timeEditText);
peter.bartos
sumber
Terima kasih atas solusinya :) Saya telah mengeditnya untuk digunakan dengan AM / PM. Lihat di sini: TimePicker dengan / tanpa AM / PM
Pratik Butani
2

Saya tidak tahu apakah ini akan berhasil untuk Anda, itu berhasil untuk saya dengan baik.

Buat metode untuk dialog pemilih Tanggal / Waktu.

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

dan kemudian, di mana pun Anda mau, Anda dapat melakukannya seperti ini

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

harap Anda menemukan ini sebagai solusi Anda.

Migue Aguirre
sumber
Saya suka dua baris "// Buat tombol batal [...]" dan "datePicker.setCancelable (false);" hue hue hue
MojioMS
Saya rasa pertanyaan ini tidak ada hubungannya dengan pertanyaan.
Pratik Butani
1

Anda belum meletakkan argumen terakhir di TimePickerDialog.

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

ini adalah kode dari TimePickerclass. itu membutuhkan argumen booleanis24HourView

swati
sumber
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);
}
virendra singh deora
sumber
7
Harap jangan hanya memposting kode; jelaskan apa yang dilakukan kode Anda dan mengapa itu menyelesaikan masalah OP.
dimo414
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
sumber
Beberapa informasi tambahan tentang kode hanya jawaban ini mungkin akan bermanfaat.
Pyves
0

Bagi saya dialog muncul lebih dari satu jika saya mengklik teks edit dpFlightDate lebih dari satu kali sama untuk dialog timmer. bagaimana caranya agar dialog ini tidak muncul hanya sekali dan jika pengguna mengklik untuk kedua kalinya, dialog tidak boleh muncul lagi, yaitu jika dialog ada di layar?

          // 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();
                }
            });
Jerry Abraham
sumber