Изтекъл диалогов прозорец на 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
Здравей, @Thyen. Актуализирах въпроса! Проблемът е малко по-объркан, защото диалоговият прозорец се създава (и отхвърля) във фрагмент, така че не знам дали това решение работи (и ако работи, не знам как!...) Има ли друго или можете да ми покажете как да го направя с помощта на Промяна на конфигурацията? Благодаря! - person Filipe Ramos; 15.06.2015
comment
Е, @FilipeRamos, за съжаление нямам достатъчно опит с използването на този метод за обработка на оформления. Използвах декларацията на манифеста, за да запазя моя фрагмент жив и да не загубя препратката към AsyncTask. Моето странно предположение е да използвам метода setContentView в метода onConfigurationTask, в изразите if, показани в отговора. Ще редактирам отговора - person Thyen Hong Guedes Chang; 15.06.2015