У меня есть приложение на рынке, и я получаю следующее исключение: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
.
Разместите onSavedInstanceState код(). –