TimePicker Dialog po kliknięciu EditText


106

Mam już DatePicker, który pojawia się, gdy użytkownik kliknie pole 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();
            }
        });

Próbowałem zrobić TimePicker w podobny sposób, ale nie mogłem go uruchomić. To jest moja próba, aby to działało

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

            }
        });

Czy nie da się tego zrobić podobnie jak w przypadku DatePicker?

Próbowałem nawet po prostu wywołać wyskakujące okienko TimePicker po kliknięciu pola EditText tym kodem.

      eReminderTime.setOnClickListener(new OnClickListener() {

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

Z jakiegoś powodu, kiedy wprowadziłem to do Android Studio, wynik „showDialog” został zaliczony.

Czy ktoś może mi dać wskazówki, gdzie idę źle? A może po prostu będę musiał użyć niestandardowego DialogFragment?


Co tak naprawdę nie działa w drugim bloku kodu ?, czy po prostu się nie pojawia, czy nie kompiluje się?
Robadob,

Pokazuje błąd w części setText między „” a selectedHour, mówi „,” lub „)”, ale kiedy wstawiam „,” mówi „nie można rozwiązać metody” setText (java.lang.String, java .lang.String) ”
Mark O'Sullivan

Odpowiedzi:


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

Brakuje wybranej godziny +między ""a wybraną godziną, setTextmetody pobierają tylko jeden ciąg, więc musisz połączyć wszystkie części (pierwsze cudzysłowy są prawdopodobnie niepotrzebne).

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

        }
    });

To powinno naprawić drugi błąd, ponieważ nie podano ostatniego parametru. Konstruktory TimePickerDialog


Próbowałem tego i myślę, że mógłbym spróbować tego wcześniej, ponieważ otrzymałem tę wiadomość wcześniej. Teraz pokazuje błąd wszystko po „new TimePickerDialog” i przed „mTimePicker.setTitle”. Błąd to „Nie można rozwiązać konstruktora” TimePickerDialog (com.appname.classname, android.app.TimePickerDialog.OnTimeSetListener, int, int) ''
Mark O'Sullivan

2
Jeśli sprawdzisz dokumentację Androida, musisz dodać końcowy parametr boolowski określający, czy okno dialogowe jest 24 godziny, czy nie. TimePickerDialog (kontekst kontekstowy, TimePickerDialog.OnTimeSetListener callBack, int hourOfDay, int minuta, boolean is24HourView)
Robadob

Całkowicie zapomniałem o wartości logicznej prawda / fałsz, widziałem to wcześniej, ale zapomniałem go dołączyć, gdy zmieniłem kod na coś podobnego do selektora dat. Dzięki za pomoc!
Mark O'Sullivan

3
Wielkie dzieki. Prawdopodobnie będziesz chciał również sformatować minuty: eReminderTime.setText (selectedHour + ":" + String.format ("% 02d", selectedMinute));
Stephen Paul

Mam nadzieję, że będzie bardziej przydatny i nadający się do ponownego użycia -> TimePickerUniversal
Pratik Butani

27

Dlaczego nie pisać w sposób wielokrotnego użytku?

Utwórz klasę 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);
        }

    }

Następnie wywołaj go z funkcji onCreate:

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

Jak uzyskać AM / PM?
Pratik Butani

10

Możesz użyć poniższego kodu w odbiorniku onclick programu 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();

Możesz zobaczyć pełny kod na przykładzie selektora czasowego Androida


3

Rozszerzyłem przyjemne rozwiązanie wielokrotnego użytku @Sumoanand, aby obsługiwać zarówno zmianę ostrości, jak i słuchaczy kliknięć podczas wielokrotnej zmiany czasu. Również aktualizacja kalendarza selektora, aby zapamiętać ostatnio wybrany czas + formatowanie GG: 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()));
    }

}

Wykorzystanie od onCreate:

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

Dziękuję za rozwiązanie :) Zmodyfikowałem go do użytku z AM / PM. Sprawdź tutaj: TimePicker z / bez AM / PM
Pratik Butani

2

Nie wiem, czy to zadziała dla ciebie, na mnie działa dobrze.

Utwórz metodę dla okna dialogowego selektora Data / Godzina.

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

a potem, gdziekolwiek chcesz, możesz to zrobić tak po prostu

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

mam nadzieję, że uznasz to za swoje rozwiązanie.


Lubię te dwie linie "// Utwórz przycisk anulowania [...]" i "datePicker.setCancelable (false);" hue hue hue
MojioMS

Myślę, że to pytanie nie jest związane z pytaniem.
Pratik Butani

1

Nie umieściłeś ostatniego argumentu w TimePickerDialog.

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

to jest kod TimePickerclass. wymaga argumentu boolowskiegois24HourView


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
Proszę nie tylko kod pocztowy; wyjaśnij, co robi twój kod i dlaczego rozwiązuje problem 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();
    }
}

Niektóre dodatkowe informacje na temat odpowiedzi tylko na ten kod byłyby prawdopodobnie przydatne.
Pyves

0

Dla mnie dialog pojawia się więcej niż jeden, jeśli kliknę tekst edycji dpFlightDate więcej niż jeden raz to samo w oknie dialogowym timera. w jaki sposób mogę uniknąć tego, aby to okno dialogowe pojawiło się tylko raz i jeśli użytkownik kliknie po raz drugi, okno dialogowe nie może się pojawić ponownie, tj. jeśli okno dialogowe jest wyświetlane na ekranie?

          // 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();
                }
            });
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.