Hộp thoại TimePicker khi nhấp vào EditText


105

Tôi đã có một DatePicker bật lên khi người dùng nhấp vào trường 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();
            }
        });

Tôi đã thử thực hiện TimePicker theo cách tương tự nhưng không thể làm cho nó hoạt động. Đây là nỗ lực của tôi để làm cho nó hoạt động

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

            }
        });

Không thể làm điều đó tương tự như cách tôi đã làm cho DatePicker?

Tôi đã thử thậm chí chỉ tạo TimePicker bật lên sau khi trường EditText được nhấp với mã này.

      eReminderTime.setOnClickListener(new OnClickListener() {

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

Vì một số lý do khi tôi nhập điều đó vào Android Studio, 'showDialog' đã bị xóa.

Bất cứ ai có thể cho tôi lời khuyên về nơi tôi đang làm sai? Hay tôi chỉ cần phải sử dụng một hộp thoại tùy chỉnh?


Điều gì không thực sự hoạt động trong khối mã thứ hai của bạn ?, nó không xuất hiện, không biên dịch?
Robadob

Hiển thị lỗi ở phần setText giữa "" và selectHour, nói rằng cần phải có ',' hoặc ')' nhưng khi tôi đặt ',' nó cho biết "không thể giải quyết phương thức" setText (java.lang.String, java .lang.String) "
Mark O'Sullivan

Câu trả lời:


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

Việc thiếu một giờ +giữa ""và giờ đã chọn của bạn, setTextcác phương thức chỉ lấy một chuỗi duy nhất, vì vậy bạn cần phải nối tất cả các phần (dấu ngoặc kép đầu tiên có thể không cần thiết).

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

        }
    });

Điều đó sẽ khắc phục lỗi thứ hai của bạn, bạn đã không cung cấp thông số cuối cùng. TimePickerDialog Constructors


Đã thử điều đó và nghĩ rằng tôi có thể đã thử điều đó trước đây vì tôi đã nhận được tin nhắn này trước đây. Hiện đang hiển thị lỗi mọi thứ sau 'TimePickerDialog mới' và trước 'mTimePicker.setTitle'. Lỗi này là 'Không thể giải quyết constructor 'TimePickerDialog (com.appname.classname, android.app.TimePickerDialog.OnTimeSetListener, int, int)''
Đánh dấu O'Sullivan

2
Nếu bạn kiểm tra tài liệu android, bạn cần thêm tham số boolean cuối cùng cho biết hộp thoại có 24 giờ hay không. TimePickerDialog (Context bối cảnh, TimePickerDialog.OnTimeSetListener callback, int HOUROFDAY, phút int, boolean is24HourView)
Robadob

Hoàn toàn quên về boolean true / false, đã thấy trước đó nhưng lại quên đưa nó vào khi tôi thay đổi mã của mình thành một thứ tương tự như bộ chọn ngày. Cảm ơn bạn đã giúp đỡ!
Mark O'Sullivan,

3
Thật sự cảm ơn. Có thể bạn cũng sẽ muốn định dạng số phút: eReminderTime.setText (selectHour + ":" + String.format ("% 02d", selectMinute));
Stephen Paul

Tôi hy vọng nó sẽ hữu ích và tái sử dụng được nhiều hơn -> TimePickerUniversal
Pratik Butani

27

Tại sao không viết theo cách có thể sử dụng lại?

Tạo lớp 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);
        }

    }

Sau đó gọi nó từ hàm onCreate:

    EditText editTextFromTime = (EditText) findViewById(R.id.editTextFromTime);
    SetTime fromTime = new SetTime(editTextFromTime, this);

Làm cách nào để nhận AM / PM?
Pratik Butani

9

Bạn có thể sử dụng mã bên dưới trong trình nghe onclick của 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();

Bạn có thể xem mã đầy đủ tại ví dụ về trình chọn thời gian trên Android


3

Tôi đã mở rộng giải pháp tái sử dụng tuyệt vời của @Sumoanand để hỗ trợ cả thay đổi tiêu điểm và nhấp vào người nghe khi thay đổi thời gian nhiều lần. Đồng thời cập nhật lịch bộ chọn để ghi nhớ thời gian đã chọn gần đây nhất + định dạng 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()));
    }

}

Cách sử dụng từ onCreate:

EditText timeEditText = (EditText) rootView.findViewById(R.id.timeText);
new TimeSetter(timeEditText);

Cảm ơn giải pháp của bạn :) Tôi đã chỉnh sửa nó để sử dụng với AM / PM. Kiểm tra tại đây: TimePicker có / không có SA / CH
Pratik Butani

2

Tôi không biết liệu điều này có hiệu quả với bạn không, nó phù hợp với tôi.

Tạo một phương thức cho hộp thoại chọn Ngày / Giờ.

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

và sau đó, bất cứ nơi nào bạn muốn, bạn có thể làm như thế này

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

hy vọng bạn tìm thấy đây là giải pháp của bạn.


Tôi thích hai dòng "// Tạo nút hủy [...]" và "datePicker.setCancelable (false);" hue hue hue
MojioMS

Tôi nghĩ câu hỏi này không liên quan đến câu hỏi.
Pratik Butani 17/1218

1

Bạn chưa đặt đối số cuối cùng trong TimePickerDialog.

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

đây là mã của TimePickerclass. nó yêu cầu một đối số booleanis24HourView


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
Xin đừng chỉ gửi mã; giải thích mã của bạn đang làm gì và tại sao nó giải quyết được vấn đề của 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();
    }
}

Một số thông tin bổ sung về câu trả lời chỉ mã này có thể sẽ có lợi.
Pyves

0

Đối với tôi, hộp thoại xuất hiện nhiều hơn một nếu tôi nhấp vào văn bản chỉnh sửa dpFlightDate nhiều hơn một lần cho hộp thoại chỉnh màu. Làm cách nào để tránh hộp thoại này chỉ xuất hiện một lần và nếu người dùng nhấp vào lần thứ hai thì hộp thoại đó không được xuất hiện nữa tức là nếu hộp thoại trên màn hình?

          // 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();
                }
            });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.