DatePickerDialog onDateSet вызывается при повороте

Я использую DialogFragment для возврата DatePickerDialog в onCreateDialog (). Я установил 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"); } 

В методе onDateSet проверьте, перезагружается ли Activity из-за изменения конфигурации, используя Activity :: isChangingConfigurations . Если да, то не показывайте 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(); } } 

Я тестировал его и отлично работал. Сообщите мне, нужна ли какая-либо дополнительная помощь.

Вы можете попробовать использовать флаг в прикрепленных / отведенных обратных вызовах диалога. Идея состоит в том, чтобы отменить любой запуск слушателя, пока диалог еще не прикреплен к окну (так что изменение не может исходить от пользователя), как восстановление (которое, по моему мнению, является причиной повторного вызова слушателя ):

 // 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 реализован, что он будет уведомлять об изменении DataSet в onStop если зарегистрирован OnDateSetListener .

Вы также можете увидеть onDateSet когда нажата DatePickerDialog Назад», когда DatePickerDialog (не только ориентация)

Причина, когда вы создали экземпляр DatePickerDialog , вы зарегистрировали прослушиватель обратного вызова.

Таким образом, лучший способ – создать custom Dialog который расширяет DatePickerDialog и отменяет onStop

Пользовательский 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" 

Когда экран вращается, активность уничтожается и воссоздается, каждый раз создается новый фрагмент. Один из способов избежать этой проблемы – изменить размещение вашего кода if (getActivity ()! = Null) в вашем коде. Поместите его где-нибудь, на который не влияет рекреация активности (не в методе OnCreate).

Intereting Posts
Что такое сигнал 33 в Android Lollipop? Android GLES20.glBlendEquation не работает? Графический макет FragmentTabHost не отображает Как реализовать Swipe в Android-игре без просмотра Не удается разрешить символ «GooglePlayServicesClient» Как программно определить, поддерживает ли приложение Android Wear? Создавать прогресс, доступный программно Тег поддержки-экранов появляется после тега приложения? Могу ли я использовать речевое распознавание Android в Kindle Fire HD? Условное включение / исключение ресурсов для сборки Android apk Время синхронизации Java, System.nanoTime (), чем System.currentTimeMillis (), но сохраняется ли оно во сне? Как установить макс. Длина текста в редакторе edittext Как узнать, когда виджет галереи перестает прокручиваться? Установите яркость экрана Android Можно ли получать уведомление, когда какой-либо провайдер местоположения включен / отключен, и выяснить, какое действие произошло?