TimePicker отображает другое время

#java #android #timepicker #android-timepicker

#java #Android #timepicker #android-timepicker

Вопрос:

У меня есть make a editText , используемый для отображения TimePicker .

 static Calendar c = null;
static int hour;
static int min;
static int hour1, min1;

 time = (EditText) promptView.findViewById(R.id.time);

  time.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        Fragment fragDialog = getActivity().getSupportFragmentManager().findFragmentByTag("TimePicker");
                        if (fragDialog == null) { // Fragment not added
                            FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
                            tp.show(ft, "TimePicker");
                        } else {
                            // already active
                        }
                    }
                });

  public static class TimePick extends android.support.v4.app.DialogFragment implements TimePickerDialog.OnTimeSetListener {

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {

            c = Calendar.getInstance();
            hour = c.get(Calendar.HOUR_OF_DAY);
            min = c.get(Calendar.MINUTE);
            return new TimePickerDialog(getActivity(), this, hour, min, DateFormat.is24HourFormat(getActivity()));
        }


        @Override
        public void onTimeSet(TimePicker view, int hourofDay, int minute) {
            time.setText(Integer.toString(hourofDay)   ":"   Integer.toString(minute));
            hour1 = hourofDay;
            min1 = minute;
        }
    }
  

При нажатии кнопки Сохранить button , оно передаст выбранное время в AlarmManager и отобразит минуту и час.

  save.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        Calendar alarm = Calendar.getInstance();
                        alarm.set(Calendar.HOUR_OF_DAY, hour1);
                        alarm.set(Calendar.MINUTE, min1);
                        alarm.set(Calendar.SECOND, 0);
                        Toast.makeText(getActivity(), hour1   ""   min1, Toast.LENGTH_SHORT).show();
                        Intent myIntent = new Intent(getActivity(), MyReceiver.class);
                        pendingIntent = PendingIntent.getBroadcast(getActivity(), 0, myIntent, 0);
                        AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(getActivity().ALARM_SERVICE);
                        alarmManager.set(AlarmManager.RTC, alarm.getTimeInMillis(), pendingIntent);
                    }
                });

                alert.setView(promptView);
                alert.show();
             }
  

Предположим, я выбираю время с 11 часами, мин с 20 и нажимаю сохранить, всплывающее окно отображается 1120 правильно. Но во второй раз я нажимаю сохранить, не нажимая время editText , Toast должно отображаться 00 , но вместо этого отображается предыдущий результат 1120 .

Комментарии:

1. Ваши hour1 и min1 являются глобальными переменными. Так вот почему они показывают старое время.

2. @DeepakGoyal Если я удалю статику, я получу сообщение об ошибке. Каков правильный способ записи?

3. вы можете переназначить значение переменным для 0 в onClick

Ответ №1:

Я не могу сказать наверняка, потому что, с одной стороны, у меня нет полного кода, а с другой стороны, я не знаю, что вы подразумеваете под «вторым разом».

Но ваши переменные объявлены как статические, это означает, что даже если вы уничтожите этот объект, при следующем создании экземпляра нового объекта эти переменные будут иметь значения, которые они имели в предыдущем экземпляре. Это потому, что статические переменные являются общими и сохраняются во всех экземплярах одного и того же класса.

 public class Foo {
    static int bar;
}

Foo a = new Foo();
a.bar = 3;

Foo b = new Foo();
Log.d("tag", "value = "   b.bar); // this will print 3
  

Редактировать:

Если вы все еще хотите использовать эти переменные таким образом, вам нужно сначала где-нибудь их очистить, но вам решать, где лучше.

 hour1 = 0;
min1 = 0;
  

Комментарии:

1. У меня есть кнопка, используемая для отображения диалогового окна, а текст редактирования времени находится внутри диалогового окна. При нажатии кнопки сохранить это будет показано в ListView.