Диалоги Android 4.1.2 вызываются дважды
У меня есть эта проблема с моим приложением, когда я звоню, чтобы показать диалог, его дважды вызывали. Это происходит только с Android 4.1 и выше. Более низкая версия работает нормально, поэтому я не думаю, что это проблема с кодом.
Слышали ли вы эту проблему раньше?
здесь код:
Button edit = (Button) ad.findViewById(R.id.editBtn);
edit.setTypeface(roboto);
edit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
setDate();
ad.dismiss();
}
});
ad.show();
ad.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
shiftsActivity.setPressed(true);
}
});
}
public void setDate() {
// Initialize and open the set date dialog
DatePickerDialog setDateDialog = new DatePickerDialog(Shifts.this,
datePickerListener, dateAndTime.get(Calendar.YEAR),
dateAndTime.get(Calendar.MONTH),
dateAndTime.get(Calendar.DAY_OF_MONTH));
setDateDialog.setTitle("Set Date");
setDateDialog.show();
}
public void setStartTime() {
TimePickerDialog setStartTimeDialog = new TimePickerDialog(Shifts.this,
startTimePicker, dateAndTime.get(Calendar.HOUR),
dateAndTime.get(Calendar.MINUTE), true);
setStartTimeDialog.setTitle("Started At:");
setStartTimeDialog.show();
}
public void setEndTime() {
TimePickerDialog setEndTimeDialog = new TimePickerDialog(Shifts.this,
setEndTime, dateAndTime.get(Calendar.HOUR),
dateAndTime.get(Calendar.MINUTE), true);
setEndTimeDialog.setTitle("Ended:");
setEndTimeDialog.show();
}
TimePickerDialog.OnTimeSetListener startTimePicker = new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
startIntHours = hourOfDay;
startIntMinutes = minute;
editStartTime = String.format("%02d", hourOfDay) + ":"
+ String.format("%02d", minute);
setEndTime();
}
};
TimePickerDialog.OnTimeSetListener setEndTime = new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
finishIntHours = hourOfDay;
finsihIntMinutes = minute;
if (finishIntHours < startIntHours) {
finishIntHours = finishIntHours + Utility.HOURS_TIME_UNIT;
}
if (finsihIntMinutes < startIntMinutes) {
finsihIntMinutes = finsihIntMinutes + Utility.MINUTES_TIME_UNIT;
}
totalHours = finishIntHours - startIntHours;
totalMinutes = finsihIntMinutes - startIntMinutes;
Log.i("TotalHours in time picker", "" + totalHours);
Log.i("Totalminute in time picker", "" + totalMinutes);
editEndTime = String.format("%02d", hourOfDay) + ":"
+ String.format("%02d", minute);
replace(Shifts.view, Shifts.position);
}
};
Ответы
Ответ 1
В соответствии с вашим кодом ни один из этих методов никогда не вызывается, потому что вы никогда не используете TimePickerDialogs
.
При этом существует известная проблема, связанная с поведением DatePickerDialog
/TimePickerDialog
, которое может быть релевантным: http://code.google.com/p/android/issues/detail?id=34833
Ответ 2
Вот базовое решение для тех, кому нужен TimeChooserDialog, который не вызывает прослушиватель дважды, с основными опциями
public static AlertDialog getTimePickerDialog(Context context, final OnTimeSetListener listener, int hour, int minute, boolean is24HFormat) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
final TimePicker timePicker = new TimePicker(context);
timePicker.setIs24HourView(is24HFormat);
timePicker.setCurrentHour(hour);
timePicker.setCurrentMinute(minute);
builder.setView(timePicker);
builder.setPositiveButton(android.R.string.ok, new OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
if(null != listener) {
listener.onTimeSet(timePicker, timePicker.getCurrentHour(), timePicker.getCurrentMinute());
}
}
});
builder.setNegativeButton(android.R.string.cancel, null);
return builder.create();
}
Ответ 3
Если вы посмотрите в источнике андроида, то появится, что onTimeSet() вызывается во время onStop(). Диалог также вызывает onTimeSet() в нем метод onClick().
Чтобы обойти это, мне пришлось переопределить диалоги увольнения и отменить функции, чтобы установить логическое значение, которое я проверил, если onTimeSet был вызван с помощью кнопки click или cancel/cancel
Ответ 4
То же самое происходит со мной для TimePicker. Я решаю этот вопрос.
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int setHour, int setMinute) {
if (view.isShown()) {
// This method will return true only once
}
}
};
iShown():
Возвращает видимость этого представления и всех его предков
Возвраты
Истинно, если этот взгляд и все его предки ВИДИМОЕ
Ответ 5
Я стараюсь, и это хорошо работает со мной, если у вас все еще есть проблема, попробуйте использовать classic singleton
Что-то вроде этого:) подробнее об этом.
public void setStartTime() {
TimePickerDialog setStartTimeDialog = NULL;
if(setStartTimeDialog == null) {
new TimePickerDialog(Shifts.this, startTimePicker, dateAndTime.get(Calendar.HOUR),dateAndTime.get(Calendar.MINUTE), true);
setStartTimeDialog.setTitle("Started At:");
}
setStartTimeDialog.show();
}
Ответ 6
Не используйте встроенный TimePickerDialog или DatePickerDialog. Вместо этого создайте настраиваемый диалог, как показано здесь. Он прост и удобен в использовании и просто работает!
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
final TimePicker timePicker = new TimePicker(getActivity());
builder.setTitle("Set Time");
builder.setView(timePicker);
builder.setNegativeButton("Cancel", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.setPositiveButton("OK"), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int minute = timePicker.getCurrentMinute();
int hourOfDay = timePicker.getCurrentHour();
}
});
builder.show();
Ответ 7
Вместо того, чтобы нарушать super.onClose() или создавать пользовательские диалоги, я решаю его, обертывая реальный слушатель и расширяя TimePickerDialog, который включает и отключает пересылку от обертки к реальному слушателю. Это не капля в замене, но она достаточно аккуратная.
public class TimePickerDialogCustom extends TimePickerDialog
{
protected TimePickerDialogOnTimeSetListenerWrapper listenerWrapper;
public TimePickerDialogCustom(Context context,
TimePickerDialogOnTimeSetListenerWrapper listener,
int hourOfDay, int minute, boolean is24HourView)
{
super(context, listener, hourOfDay, minute, is24HourView);
listenerWrapper = listener;
}
@Override
protected void onStop()
{
if (listenerWrapper != null)
listenerWrapper.enabled = false;
super.onStop();
if (listenerWrapper != null)
listenerWrapper.enabled = true;
}
public static final class TimePickerDialogOnTimeSetListenerWrapper implements TimePickerDialog.OnTimeSetListener
{
private boolean enabled = true;
private final TimePickerDialog.OnTimeSetListener delegate;
public TimePickerDialogOnTimeSetListenerWrapper(TimePickerDialog.OnTimeSetListener delegate)
{
this.delegate = delegate;
}
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute)
{
if (enabled)
{
this.delegate.onTimeSet(view, hourOfDay, minute);
}
}
}
}
Затем, чтобы использовать его:
TimePickerDialogCustom.TimePickerDialogOnTimeSetListenerWrapper listenerWrapper =
new TimePickerDialogCustom.TimePickerDialogOnTimeSetListenerWrapper(realListener);
// Create a new instance of DatePickerDialog and return it
TimePickerDialogCustom dialog = new TimePickerDialogCustom(
getActivity(),
listenerWrapper,
hourOfDay,
minute,
DateFormat.is24HourFormat(getActivity()));
Ответ 8
Я столкнулся с этой проблемой, показывая дважды. Я превысил onStop() TimePickerDialog и решил эту проблему. Кроме того, вы не должны называть super.onStop() в своем overriden onStop().
@Override
public void onStop() {
//super.onStop();
Log.d(TAG, "onStop of starttime TimePickerDialog.");
}