TimePicker-Dialogfeld durch Klicken auf EditText

105

Ich habe bereits einen DatePicker, der angezeigt wird, wenn der Benutzer auf das Feld EditText klickt

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

Ich habe versucht, einen TimePicker auf ähnliche Weise auszuführen, konnte ihn jedoch nicht zum Laufen bringen. Dies ist mein Versuch, es zum Laufen zu bringen

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

            }
        });

Ist es unmöglich, es so zu machen, wie ich es für DatePicker gemacht habe?

Ich habe sogar versucht, einen TimePicker zu öffnen, sobald das EditText-Feld mit diesem Code angeklickt wurde.

      eReminderTime.setOnClickListener(new OnClickListener() {

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

Aus irgendeinem Grund wurde der 'showDialog' bewertet, als ich das in Android Studio eingegeben habe.

Kann mir jemand Tipps geben, wo ich falsch liege? Oder muss ich nur ein benutzerdefiniertes DialogFragment verwenden?

Mark O'Sullivan
quelle
Was funktioniert in Ihrem zweiten Codeblock eigentlich nicht? Erscheint es einfach nicht, wird es nicht kompiliert?
Robadob
Zeigt einen Fehler im setText-Teil zwischen "" und selectedHour an, sagt ein ',' oder a ')', aber wenn ich ein 'setze, heißt es "kann die Methode' setText (java.lang.String, java nicht auflösen) .lang.String) "
Mark O'Sullivan

Antworten:

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

Wenn Sie eine +Zwischen- ""und eine ausgewählte Stunde verpassen , verwenden die setTextMethoden nur eine einzige Zeichenfolge, sodass Sie alle Teile verketten müssen (die ersten Anführungszeichen sind wahrscheinlich nicht erforderlich).

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

        }
    });

Das sollte Ihren zweiten Fehler beheben, Sie haben nicht den letzten Parameter angegeben. TimePickerDialog-Konstruktoren

Robadob
quelle
Versuchte das und denke, ich könnte das schon einmal versucht haben, weil ich diese Nachricht schon einmal bekommen habe. Zeigt jetzt einen Fehler alles nach 'new TimePickerDialog' und vor 'mTimePicker.setTitle' an. Der Fehler lautet 'Konstruktor kann nicht aufgelöst werden' TimePickerDialog (com.appname.classname, android.app.TimePickerDialog.OnTimeSetListener, int, int) ''
Mark O'Sullivan
2
Wenn Sie die Android-Dokumentation überprüfen, müssen Sie einen letzten booleschen Parameter hinzufügen, der angibt, ob der Dialog 24 Stunden dauert oder nicht. TimePickerDialog (Kontextkontext, TimePickerDialog.OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView)
Robadob
Ich habe den True / False-Booleschen Wert vollständig vergessen, habe ihn aber früher gesehen, aber vergessen, ihn einzuschließen, als ich meinen Code in einen ähnlichen Code wie die Datumsauswahl geändert habe. Danke für Ihre Hilfe!
Mark O'Sullivan
3
Super danke. Sie werden wahrscheinlich auch die Minuten formatieren wollen: eReminderTime.setText (selectedHour + ":" + String.format ("% 02d", selectedMinute));
Stephen Paul
Ich hoffe, es wird nützlicher und wiederverwendbarer sein -> TimePickerUniversal
Pratik Butani
27

Warum nicht wiederverwendbar schreiben?

SetTime-Klasse erstellen:

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

    }

Rufen Sie es dann über die Funktion onCreate auf:

    EditText editTextFromTime = (EditText) findViewById(R.id.editTextFromTime);
    SetTime fromTime = new SetTime(editTextFromTime, this);
Sumoanand
quelle
Wie bekomme ich AM / PM?
Pratik Butani
9

Sie können den folgenden Code im Onclick-Listener von edittext verwenden

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

Sie können den vollständigen Code im Android Timepicker-Beispiel sehen

Ramees
quelle
3

Ich habe die schöne wiederverwendbare Lösung von @Sumoanand erweitert, um sowohl Fokuswechsel- als auch Klick-Listener zu unterstützen, wenn die Zeit mehrmals geändert wird. Aktualisieren Sie auch den Auswahlkalender, um die zuletzt ausgewählte Zeit + Formatierung HH: mm zu speichern

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

}

Verwendung von onCreate:

EditText timeEditText = (EditText) rootView.findViewById(R.id.timeText);
new TimeSetter(timeEditText);
peter.bartos
quelle
Vielen Dank für Ihre Lösung :) Ich habe sie für die Verwendung mit AM / PM bearbeitet. Check out hier: TimePicker mit / ohne AM / PM
Pratik Butani
2

Ich weiß nicht, ob das für dich funktioniert, es funktioniert für mich ganz gut.

Erstellen Sie eine Methode für das Dialogfeld Datums- / Uhrzeitauswahl.

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

und dann, wo immer Sie wollen, können Sie es einfach so machen

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

Ich hoffe, Sie finden dies als Ihre Lösung.

Migue Aguirre
quelle
Ich mag die beiden Zeilen "// Abbrechen-Schaltfläche erstellen [...]" und "datePicker.setCancelable (false);" Farbton Farbton Farbton
MojioMS
Ich denke, diese Frage hat nichts mit der Frage zu tun.
Pratik Butani
1

Sie haben das letzte Argument nicht in die TimePickerDialog.

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

Dies ist der Code der TimePickerclass. es erfordert ein boolesches Argumentis24HourView

Swati
quelle
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
quelle
7
Bitte nicht nur Postleitzahl; Erklären Sie, was Ihr Code tut und warum er das Problem von OP löst.
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
quelle
Einige zusätzliche Informationen zu diesem Code nur Antwort wären wahrscheinlich von Vorteil.
Pyves
0

Für mich erscheint der Dialog mehr als einmal, wenn ich mehr als einmal auf den dpFlightDate-Bearbeitungstext klicke, um den Timmer-Dialog zu starten. Wie kann ich vermeiden, dass dieser Dialog nur einmal angezeigt wird und wenn der Benutzer zum zweiten Mal klickt, darf der Dialog nicht erneut angezeigt werden, dh wenn der Dialog auf dem Bildschirm angezeigt wird?

          // 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
quelle