1

У меня есть приложение на рынке, и я получаю следующее исключение:FragmentTransaction совершить в OnClick «IllegalStateException: Не удается выполнить это действие после того, как onSaveInstanceState»

Fatal Exception: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
    at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1343) 
    at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1361) 
    at android.app.BackStackRecord.commitInternal(BackStackRecord.java:729) 
    at android.app.BackStackRecord.commit(BackStackRecord.java:705) 
    at com.mysupercoolapp.ui.fragments.ResultFragment$2.onItemClick(ResultFragment.java:139) 
    at android.widget.AdapterView.performItemClick(AdapterView.java:339) 
    at android.widget.AbsListView.performItemClick(AbsListView.java:1544) 
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:3721) 
    at android.widget.AbsListView$3.run(AbsListView.java:5660) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:145) 
    at android.app.ActivityThread.main(ActivityThread.java:6837) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 

Я уже прочитал большинство вопросов по этому вопросу, но Я не знаю, что я делаю неправильно в своем коде. Это не то, что я заменяю фрагмент в методе onResume. Я также не кэширую экземпляр FragmentTransaction. Я заменяю фрагмент, когда пользователь щелкает элемент в ListView.

код рабочий процесс My осколок следующая

OnCreateView> выполняет AsyncTask, чтобы загрузить некоторые элементы из базы данных> onPostExecute вызывает метод, который устанавливает адаптер для ListView и добавляет OnItemClickListener поэтому, когда пользователь нажимает элемент в ListView он открывает элемент в другом фрагменте.

Вот код для этого:

@Override 
protected void onPostExecute(ResultAdapter adapter) { 
    // post execute in AsyncTask 
    setListAdapter(adapter); 
} 

public void setListAdapter(final ResultAdapter adapter) { 
    if (adapter != null && isAdded()) { 
     resultList.setAdapter(adapter); 
     resultList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       final FragmentTransaction ft = getFragmentManager().beginTransaction(); 
       SomeFragment fragment = new SomeFragment(); 
       ft.replace(R.id.content_frame, fragment, "main_fragment"); 
       ft.addToBackStack(null); 
       ft.commit(); 
      } 
     }); 
     adapter.notifyDataSetChanged(); 
    } 
} 

Есть ли лучшее решение, чем вызов commitAllowingStateLoss() или преимущественную onSaveInstanceState()?

P.S .: Я нацеливаю API> 14 и пользуюсь стандартным пакетом android.app.FragmentTransaction.

+0

Разместите onSavedInstanceState код(). –

ответ

0

Эта проблема возникает, когда onPostExecute() вызывается, когда приложение минимизируется, особенно когда вызывается onPostExecute() после того, как вызывается метод операции onSaveInstanceState().

Если вы беспокоитесь о потере штата, я предлагаю отменить ваш AsyncTask, когда пользователь минимизирует приложение (возможно, в методе onStop()). Затем в вашем onPostExecute() вызовите setListAdapter(adapter), только если номер AsyncTask не отменен. Это гарантирует, что вы не закончите настройку адаптера после вызова onSaveInstanceState().

Более подробная информация о том, как сделать это здесь: https://stackoverflow.com/a/12342937/4747587

+2

Я не думаю, что это решает проблему. У меня точно такой же отчет о сбоях, который появляется несколько раз, но в моем коде нет asyncTasks. Я установил адаптер и onItemClickListener в onCreateView фрагмента. Вопрос в том, как можно щелкнуть по элементу списка в фрагменте, который уже сохранил его состояние. Этот отчет о сбоях не имеет никакого смысла. – Jonas