旋转时调用DatePickerDialog onDateSet

我正在使用DialogFragment返回onCreateDialog()中的DatePickerDialog。 我已经将dateSetListener设置为DialogFragment(下面的示例中的“this”),除了在发生屏幕旋转时调用onDateSet(),这是不可取的。 如何让onDateSet在屏幕旋转时不被调用?

我的对话框片段

public static class DateDialogFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{ public static DateDialogFragment newInstance() { return new DateDialogFragment(); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new DatePickerDialog(getActivity(), this, 2012, 11, 19); } @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { //This is called when screen rotated, which I dont want Toast.makeText(getActivity(), "Year: "+year+" Month: "+monthOfYear+" Day: "+dayOfMonth, Toast.LENGTH_SHORT).show(); } } 

这就是我所说的

 if(getActivity()!=null){ FragmentManager fm = getActivity().getSupportFragmentManager(); DialogFragment newFragment = DateDialogFragment.newInstance(); newFragment.show(fm, "dialog"); } 

Solutions Collecting From Web of "旋转时调用DatePickerDialog onDateSet"

onDateSet方法中,通过使用Activity :: isChangingConfigurations检查Activity是否由于configuration更改而重新启动。 如果是,则不显示Toast

 @Override public void onDateSet(android.widget.DatePicker view, int year, int monthOfYear, int dayOfMonth) { if( ! this.getActivity().isChangingConfigurations() ) { // Dialog is dismissed by user explicitly, hence show the Toast message. Toast.makeText(getActivity(), "Year: "+year+" Month: "+monthOfYear+" Day: "+dayOfMonth, Toast.LENGTH_SHORT).show(); } } 

我testing了它,并完美地工作。 让我知道是否需要进一步的帮助。

您可以尝试在对话框的附加/分离callback中使用标志。 这个想法是取消任何触发的监听器,而对话框还没有附加到窗口(所以更改不可能来自用户)像恢复(我认为是再次调用监听器的原因):

 // a field in the DateDialogFragment private boolean mShouldBeCanceled = true; // cancel the listener when this is true(the default) //... @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new DatePickerDialog(getActivity(), this, 2012, 11, 19) { @Override public void onAttachedToWindow() { mShouldBeCanceled = false; } @Override public void onDetachedFromWindow() { mShouldBeCanceled = true; } }; } 

并在侦听器中使用该标志(由于侦听器仅在构造函数中初始化):

 @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { if (mShouldBeCanceled) { return; // not a valid listener triggering } //This is called when screen rotated, which I dont want Toast.makeText(getActivity(), "Year: "+year+" Month: "+monthOfYear+" Day: "+dayOfMonth, Toast.LENGTH_SHORT).show(); } 

DatePickerDialog被实现的方式,如果OnDateSetListener被注册,它将通知OnDateSetListenerDataSet变更。

DatePickerDialog显示时,您也可以看到在按下Back键时调用onDateSet (不仅是方向)

原因,当你创buildDatePickerDialog实例时,你已经注册了callback监听器。

所以最好的方法是创build一个扩展DatePickerDialog并覆盖onStopcustom Dialog

自定义DatePickerDialog

  private static class CustomDatePickerDialog extends DatePickerDialog{ public CustomDatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) { super(context, callBack, year, monthOfYear, dayOfMonth); } @Override protected void onStop() { return; } } 

最后,将CreateDialog改为

 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new CustomDatePickerDialog(getActivity(), this, 2012, 11, 19); } 

这应该完美。 让我知道,如果你看到任何问题。

尝试更换线路

  @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new DatePickerDialog(getActivity(), this, 2012, 11, 19); } 

通过

 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { super.onCreateDialog(savedInstanceState); } 

将此属性添加到清单中的活动

 android:configChanges="keyboardHidden|orientation" 

当屏幕旋转时,活动被破坏并重新创build,每次创build一个新的片段。 避免这个问题的一种方法是改变你的代码中if(getActivity()!= null)语句的位置。 将其放置在不受活动重新创build影响的位置(不在OnCreate方法中)。