2012-12-06 32 views
13

当我调用显示对话框时,我的应用程序出现此问题,它以某种方式被调用两次。这只适用于android 4.1及以上版本。低版本工作正常,所以我不认为这是任何代码问题。Android 4.1.2对话框被调用两次

您听说过\遇到过这个问题吗?

这里的代码:

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

有趣的部分是:其中'setStartTime'称为 – zapl

+0

在4.0.3它工作正常 – Talha

+0

这是事实,问题源于4.1以上开始。 – Yosi199

回答

12

根据你的代码,无论这些方法是不断调用,因为你永远不使用TimePickerDialogs

话虽这么说,有相关的DatePickerDialog/TimePickerDialog的行为,可能是相关的已知问题:http://code.google.com/p/android/issues/detail?id=34833

+0

感谢您的快速回复Mark,我添加了调用整个流程的代码。点击你调用setDate()的按钮,流程开始。 – Yosi199

+0

@ Yosi199:如果我引用的错误对你没有帮助,那么我没有进一步的答案。然而,在我看来,最好是让用户拥有一个'DateAndTimeActivity',托管一个'DatePicker'和'TimePicker',而不是用两个单独的对话框搞砸。 – CommonsWare

+0

我计划在进一步检查该错误时会在您提供的链接中提供一个建议的临时解决方案。否则,我会重新访问我的代码并考虑您的建议。我非常感谢你的时间,你确实帮了我。 – Yosi199

0

我尝试它,它是很好的工作与我,如果你仍然有问题,尝试使用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(); 

} 
+0

谢谢你的帮助,但这并没有帮助我。我已经更新了代码,所以如果你能再看一次,我会很感激。谢谢 – Yosi199

2

如果您在Android源看起来似乎onTimeSet()的onStop期间调用() 。该对话框还在onClick()方法中调用onTimeSet()。

为了解决这个问题,我不得不重写对话框解雇和取消功能设置,我检查,如果onTimeSet正在从按钮点击称为布尔或解聘/取消

+0

谢谢,这已不再相关,但我仍然重视这些信息以供将来使用 – Yosi199

3

下面是一个基本的解决方案,用于人谁需要一个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(); 
} 
+0

这称为您制作了两次的自定义对话框。 – James

-1

我面对显示两次timepicker这个问题。我已经覆盖了TimePickerDialog的onStop()并解决了问题。你也不应该在被覆盖的onStop()中调用super.onStop()。

@Override 
public void onStop() { 
    //super.onStop(); 
    Log.d(TAG, "onStop of starttime TimePickerDialog."); 
} 
+0

03-14 15:18:47.891:E/AndroidRuntime(29055):android.app.SuperNotCalledException:片段DatePickerFragment {425cf2a0}没有调用super.onStop() 03-14 15:18:47.891:E/AndroidRuntime(29055):\t at android.app.Fragment.performStop(Fragment.java:1961) 03-14 15:18:47.891:E/AndroidRuntime(29055):\t at android.app.FragmentManagerImpl.moveToState(FragmentManager。 Java的:970) –

0

请勿使用内置的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(); 
1

对于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():

返回此观点的知名度和其所有祖先

返回 如果此观点及其所有祖先的可见

0

不是违反相反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()));