popBackStack () после saveInstanceState () - PullRequest
       9

popBackStack () после saveInstanceState ()

35 голосов
/ 19 сентября 2011

Я столкнулся с проблемой, когда у меня есть активность с несколькими фрагментами.Для любого отдельного фрагмента вы можете выполнить операцию поиска, которая прекрасно работает ... если вы выполняете поиск по любому из фрагментов, он отобразит новое действие для обработки поиска, а затем вернет результат в действие для обработки отображенияновый фрагментПроблема в том, что после операции поиска я хочу иметь возможность очистить (почти) все фрагменты, используя popBackStackImmediate(...), и так как был вызван saveInstanceState(...), я получаю исключение, которое говорит:

"java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState"

Любая идея, как выскочить из заднего стека после того, как onSaveInstanceState был вызван?

Ответы [ 6 ]

21 голосов
/ 20 сентября 2011

Видимо, моя проблема возникла из-за вызова в onActivityResult (...)

Мне удалось решить проблему, поместив код модификации пользовательского интерфейса в Runnable, а затем разместив Runnable в основном потоке:

Runnable r = new Runnable() {
    @Override
    public void run() {
        // UI code here
    }
};
Handler h = new Handler();
h.post(r);
17 голосов
/ 07 января 2015

сначала позвоните super.onActivityResult до того, как ваша логика, и проблема будет исправлена ​​как onActivityResult вызовов FragmentActivity mFragments.noteStateNotSaved();

5 голосов
/ 22 июля 2016

Этот ответ может кому-то помочь. Когда ваша активность не видна, вы не можете вызвать popBackStackImmediate (...), она выдаст недопустимое исключение: невозможно выполнить это действие после состояния onsaveinstance.

Вместо этого вы можете проверить, видна ли активность или нет? перед вызовом popBackStackImmediate ().

Если ваша активность не видна, не вызывайте popBackStackImmediate. Через логический флаг, которого вы можете достичь, когда снова откроется активность .

Ex:

public class MainActivity extends Activity {

// Below flag used to check activity visible or not?
private boolean isActivityVisible;

    @Override
    public void onResume() {
        super.onResume();
        isActivityVisible = true;
    }

    public void onPause() {
        super.onPause();
        isActivityVisible = false;
    }

}
1 голос
/ 19 сентября 2011

Как насчет выталкивания стека непосредственно перед началом связанной с ним деятельности?onSaveInstanceState не будет вызываться до тех пор, пока не будет вызвана функция startActivity (а новая активность появилась перед текущей 0 ... непосредственно перед этим, верните стек фрагментов обратно в желаемое состояние и затем вызовите startActivity.

, так какстек фрагментов - это слой над обычным стеком задач / назад, я думаю, что изменение его «из середины» вызовет проблемы, и именно поэтому вы видите проблему.

0 голосов
/ 08 ноября 2018

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

getActivity().getSupportFragmentManager().popBackStackImmediate();
0 голосов
/ 08 июля 2018

Или просто поместите это в try-catch:

try {
  getSupportFragmentManager.popBackStack()
} catch (IllegalStateException e) {
  // ignore
}

Это в основном то же самое, что и commitAllowingStateloss(), за исключением того, что у нас нет popBackStackAllowingStateloss().

В большинствея получаю сообщение об ошибке, даже если мне не нужно сохранять состояние.

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