Диалоговое окно Android просочилось во время изменения ориентации

Я показываю диалоговое окно на фрагменте, который должен быть закрыт после завершения выполнения асинхронной задачи. Все работает отлично, пока я не изменю ориентацию во время отображения диалогового окна: я получаю ошибку утечки окна. Я знаю, что это потому, что действие воссоздано, а диалог «привязан» к старому. Я не могу использовать android:configChanges="keyboardHidden|orientation|screenSize" в манифесте, потому что у меня разные макеты для альбомной и портретной ориентации, поэтому я закрыл диалоговое окно метода onPause() и воссоздал его снова при создании нового действия. Но теперь у меня другая проблема: моя асинхронная задача не имеет ссылки на новый диалог, поэтому не может его закрыть...

Я уже пробовал то же самое с фрагментом диалога, но проблема не устранена.

Есть ли способ обойти эту проблему?

Спасибо.


person Filipe Ramos    schedule 15.06.2015    source источник
comment
просто используйте пакет и используйте onSaveInstanceState   -  person user2511882    schedule 15.06.2015
comment
Привет, @user2511882. Можете ли вы сказать мне, что вы предлагаете мне сэкономить на методе onSaveInstanceState? Я уже использую его для сохранения логического значения, которое говорит, отображается ли диалоговое окно...   -  person Filipe Ramos    schedule 16.06.2015


Ответы (1)


Я знаю, вы сказали, что не можете использовать android:configChanges="keyboardHidden|orientation|screenSize", потому что у вас разные макеты для альбомной и вертикальной ориентации, но взгляните наДокументация по Android, касающаяся самостоятельной обработки изменений конфигурации:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        setContentView(R.layout.landscapeLayout);
        //update your view elements, if any
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        setContentView(R.layout.portraitLayout);
        //update your view elements, if any
    }
}

Таким образом, вы можете поддерживать различные макеты и сохранять ссылку на свой диалог.

person Thyen Hong Guedes Chang    schedule 15.06.2015
comment
Привет, @Тиен. Я обновил вопрос! Проблема немного сложнее, потому что диалоговое окно создается (и закрывается) во фрагменте, поэтому я не знаю, работает ли это решение (а если работает, то не знаю, как!...) Есть ли другое образом, или вы можете показать мне, как это сделать с помощью изменения конфигурации? Спасибо! - person Filipe Ramos; 15.06.2015
comment
Что ж, @FilipeRamos, к сожалению, у меня недостаточно опыта использования этого метода для обработки макетов. Я использовал объявление манифеста, чтобы сохранить свой фрагмент и не потерять ссылку на AsyncTask. Мое дикое предположение состоит в том, чтобы использовать метод setContentView в методе onConfigurationTask в операторах if, показанных в ответе. я отредактирую ответ - person Thyen Hong Guedes Chang; 15.06.2015