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中的项目时替换片段。

我的碎片的代码工作流程如下

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

此问题时,当应用程序被最小化,尤其是当活性onSaveInstanceState()方法被调用后onPostExecute()称为onPostExecute()被调用。

如果您担心状态丢失,那么我建议您在用户最小化应用程序时(可能在onStop()方法中)取消AsyncTask。然后在您的onPostExecute()中,只有在AsyncTask未被取消的情况下才致电setListAdapter(adapter)。这将确保您在调用onSaveInstanceState()后不会最终设置适配器。关于如何做到这一点

更多信息是在这里:https://stackoverflow.com/a/12342937/4747587

+2

我不认为这解决了这个问题。我有完全相同的崩溃报告多次显示,但我的代码中没有asyncTasks。我在onCreateView的片段中设置了适配器和onItemClickListener。问题是......如何在已经保存状态的片段的列表视图中点击一个项目。这个崩溃报告没有任何意义。 – Jonas

相关问题