Boîte de dialogue TimePicker après avoir cliqué sur EditText


106

J'ai déjà un DatePicker qui apparaît lorsque l'utilisateur clique sur le champ 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();
            }
        });

J'ai essayé de faire un TimePicker de la même manière mais je n'ai pas réussi à le faire fonctionner. C'est ma tentative de le faire fonctionner

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

            }
        });

Est-il impossible de le faire de la même manière que je l'ai fait pour DatePicker?

J'ai même essayé de faire apparaître un TimePicker une fois que le champ EditText est cliqué avec ce code.

      eReminderTime.setOnClickListener(new OnClickListener() {

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

Pour une raison quelconque, lorsque je l'ai entré dans Android Studio, le «showDialog» a été éliminé.

Quelqu'un peut-il me donner des conseils pour savoir où je me trompe? Ou vais-je simplement devoir utiliser un DialogFragment personnalisé?


Qu'est-ce qui ne fonctionne pas réellement dans votre deuxième bloc de code ?, n'apparaît-il tout simplement pas, n'est-il pas compilé?
Robadob

Affiche une erreur dans la partie setText entre "" et selectedHour, indique qu'un ',' ou un ')' est nécessaire mais quand je mets un ',' il dit "impossible de résoudre la méthode 'setText (java.lang.String, java .lang.String) "
Mark O'Sullivan

Réponses:


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

Il manque une heure +entre ""et une heure sélectionnée, les setTextméthodes ne prennent qu'une seule chaîne, vous devez donc concaténer toutes les parties (les premiers guillemets sont probablement inutiles).

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

        }
    });

Cela devrait corriger votre deuxième erreur, vous ne fournissiez pas le dernier paramètre. Constructeurs TimePickerDialog


J'ai essayé cela et je pense que je pourrais avoir essayé cela avant parce que j'ai déjà reçu ce message. Affiche maintenant une erreur tout après «new TimePickerDialog» et avant «mTimePicker.setTitle». L'erreur est 'Impossible de résoudre le constructeur' TimePickerDialog (com.appname.classname, android.app.TimePickerDialog.OnTimeSetListener, int, int) ''
Mark O'Sullivan

2
Si vous consultez la documentation Android, vous devez ajouter un paramètre booléen final indiquant si la boîte de dialogue dure 24 heures ou non. TimePickerDialog (Contexte contextuel, TimePickerDialog.OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView)
Robadob

Complètement oublié le booléen vrai / faux, vu cela plus tôt, mais j'ai oublié de l'inclure lorsque j'ai changé mon code en quelque chose de similaire au sélecteur de date. Merci de votre aide!
Mark O'Sullivan

3
Super merci. Vous allez probablement vouloir formater les minutes aussi: eReminderTime.setText (selectedHour + ":" + String.format ("% 02d", selectedMinute));
Stephen Paul

J'espère qu'il sera plus utile et réutilisable -> TimePickerUniversal
Pratik Butani

27

Pourquoi ne pas écrire de manière réutilisable?

Créez la classe 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);
        }

    }

Puis appelez-le depuis la fonction onCreate:

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

Comment obtenir AM / PM?
Pratik Butani

10

Vous pouvez utiliser le code ci-dessous dans l'écouteur onclick d'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();

Vous pouvez voir le code complet à l' exemple de timepicker Android


3

J'ai étendu la belle solution réutilisable de @Sumoanand pour prendre en charge à la fois le changement de focus et les écouteurs de clic lors du changement d'heure plusieurs fois. Mise à jour également du calendrier du sélecteur pour se souvenir de la dernière heure sélectionnée + formatage 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()));
    }

}

Utilisation depuis onCreate:

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

Merci pour votre solution :) Je l'ai édité pour l'utiliser avec AM / PM. Découvrez ici: TimePicker avec / sans AM / PM
Pratik Butani

2

Je ne sais pas si cela fonctionnera pour vous, cela fonctionne très bien pour moi.

Créez une méthode pour la boîte de dialogue de sélection de date / heure.

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

et puis, où tu veux tu peux le faire comme ça

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

j'espère que vous trouverez cela comme votre solution.


J'aime les deux lignes "// Créer un bouton d'annulation [...]" et "datePicker.setCancelable (false);" hue hue hue
MojioMS

Je pense que cette question n'est pas liée à la question.
Pratik Butani du

1

Vous n'avez pas mis le dernier argument dans le TimePickerDialog.

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

c'est le code du TimePickerclass. il nécessite un argument booléenis24HourView


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
Merci de ne pas simplement poster le code; Expliquez ce que fait votre code et pourquoi il résout le problème d'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();
    }
}

Des informations supplémentaires sur cette réponse code seulement seraient probablement utiles.
Pyves

0

Pour moi, le dialogue apparaît plus d'un si je clique sur le texte d'édition dpFlightDate plus d'une fois même pour la boîte de dialogue du minuteur. comment puis-je éviter que cette boîte de dialogue n'apparaisse qu'une seule fois et si l'utilisateur clique la deuxième fois la boîte de dialogue ne doit plus apparaître, c'est-à-dire si la boîte de dialogue est à l'écran?

          // 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();
                }
            });
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.