TimePicker Dialog จากการคลิก EditText


107

ฉันมี 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 ระบุว่าจำเป็นต้องมี ',' หรือ a ')' แต่เมื่อฉันใส่ '' มันจะระบุว่า "ไม่สามารถแก้ไขวิธีการ 'setText (java.lang.String, java .lang.String) "
Mark O'Sullivan

คำตอบ:


235
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) ''
Mark O'Sullivan

2
หากคุณตรวจสอบเอกสารของ Android คุณจะต้องเพิ่มพารามิเตอร์บูลีนขั้นสุดท้ายที่ระบุว่ากล่องโต้ตอบเป็น 24 ชั่วโมงหรือไม่ TimePickerDialog (บริบทบริบท, TimePickerDialog OnTimeSetListener callBack, int hourOfDay, int นาทีบูลีน is24HourView)
Robadob

ลืมไปโดยสิ้นเชิงเกี่ยวกับบูลีนจริง / เท็จเห็นว่าก่อนหน้านี้ แต่ลืมรวมไว้เมื่อฉันเปลี่ยนรหัสเป็นสิ่งที่คล้ายกับตัวเลือกวันที่ ขอบคุณสำหรับความช่วยเหลือของคุณ!
Mark O'Sullivan

3
ขอบคุณมาก คุณอาจต้องการจัดรูปแบบนาทีด้วย: eReminderTime.setText (selectedHour + ":" + String.format ("% 02d", selectedMinute));
Stephen Paul

ฉันหวังว่ามันจะมีประโยชน์มากขึ้นและใช้งานได้อีกครั้ง -> 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);

วิธีรับ AM / PM
Pratik Butani

10

คุณสามารถใช้โค้ดด้านล่างใน onclick listener ของ 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();

คุณสามารถดูโค้ดทั้งหมดได้ที่ตัวอย่าง timepicker ของ Android


3

ฉันได้ขยายโซลูชันที่สามารถนำกลับมาใช้ใหม่ได้ของ @Sumoanand เพื่อรองรับทั้งการเปลี่ยนโฟกัสและผู้ฟังคลิกเมื่อเปลี่ยนเวลาหลาย ๆ ครั้ง ยังอัปเดตปฏิทินตัวเลือกให้จำเวลาที่เลือกล่าสุด + การจัดรูปแบบ 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()));
    }

}

การใช้งานจาก onCreate:

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

ขอบคุณสำหรับวิธีแก้ปัญหาของคุณ :) ฉันได้แก้ไขเพื่อใช้กับ AM / PM ตรวจสอบที่นี่: TimePicker with / without 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


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

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

ข้อมูลเพิ่มเติมบางอย่างเกี่ยวกับรหัสนี้คำตอบเท่านั้นที่อาจเป็นประโยชน์
ไพฟส์

0

สำหรับฉันกล่องโต้ตอบจะปรากฏมากกว่าหนึ่งรายการถ้าฉันคลิกที่ข้อความแก้ไข dpFlightDate มากกว่าหนึ่งครั้งเหมือนกันสำหรับกล่องโต้ตอบตัวจับเวลา ฉันจะหลีกเลี่ยงไม่ให้กล่องโต้ตอบนี้ปรากฏเพียงครั้งเดียวได้อย่างไรและหากผู้ใช้คลิกครั้งที่ 2 กล่องโต้ตอบจะต้องไม่ปรากฏขึ้นอีกเช่นหากกล่องโต้ตอบอยู่บนหน้าจอ

          // 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();
                }
            });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.