Intereting Posts
EROOR Lunching Genymotion "Недопустимый путь: VBoxManage" Ошибка при поддержке lib appcompat_v7 Feature Custom Title: Невозможно объединить пользовательские заголовки в API 11 и выше Функция Samsung «Оптимизация приложения» отключает фоновые приложения через 3 дня Android: notifyDataSetChanged () не обновляет listview после изменения ориентации Вырезать, скопировать, вставить в android Android – прикреплять данные к просмотру Автоматически отображать панель инструментов для Google Карт Android NSD не обнаруживает всех сервисов Как изменить имя устройства? (Устройства adb) Почему Android-адаптер удаляет расширение .gz для расширения активов? Android Google Войти мигает небольшим пустым белым полем при входе в систему Отправка сообщений (уведомление) группе – Android ResConfigs для типа сборки Банку этого файла класса принадлежит контейнер «Android Dependencies», который не позволяет изменять исходные вложения источника в своих записях

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"); } 

Solutions Collecting From Web of "DatePickerDialog onDateSet вызывается при повороте"

В методе 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).