Подтвердить что ты не робот

PopBackStack() после saveInstanceState()

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

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

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

4b9b3361

Ответ 1

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

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

Runnable r = new Runnable() {
    @Override
    public void run() {
        // UI code here
    }
};
Handler h = new Handler();
h.post(r);

Ответ 2

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

Ответ 3

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

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

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

Пример:

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

}

Ответ 4

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

Поскольку стек фрагментов является слоем над обычным стеком задачи/назад, я думаю, что его изменение "из середины" вызовет проблемы и почему вы видите проблему.

Ответ 5

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

getActivity().getSupportFragmentManager().popBackStackImmediate();

Ответ 6

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

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

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

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