OnClick中的FragmentTransaction提交“IllegalStateException:onSaveInstanceState后无法执行此操作”

时间:2015-11-07 10:33:12

标签: android android-fragments onitemclicklistener illegalstateexception fragmenttransaction

我在市场上有一个应用程序,我得到以下例外:

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方法中替换Fragment。我也没有缓存FragmentTransaction实例。 当用户单击ListView中的项目时,我会替换Fragment。

My Fragment的代码工作流程如下

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&gt; 14我正在使用标准android.app.FragmentTransaction包。

1 个答案:

答案 0 :(得分:0)

当应用程序最小化时调用onPostExecute()时会出现此问题,尤其是在调用活动的onPostExecute()方法后调用onSaveInstanceState()时。

如果您担心状态丢失,那么我建议您在用户最小化应用程序时取消AsyncTask(可能在onStop()方法中)。然后在onPostExecute() setListAdapter(adapter)中,仅在AsyncTask未取消时调用onSaveInstanceState()。这将确保您在调用 $tabs = array( 'Tab Heading 1'=>array('id'=>'tab1','content'=> $this->renderPartial('_chart1', array('data1'=>$data1), TRUE)), 'Tab Heading 2'=>array('id'=>'tab2','content'=> $this->renderPartial('_chart2', array('data2'=>$data2), TRUE)), ); $this->widget('zii.widgets.jui.CJuiTabs',array( 'tabs'=> $tabs, // additional javascript options for the tabs plugin 'options'=>array( 'collapsible'=>false, ), 'id'=>'MyTabs', )); 后不会最终设置适配器。

有关如何完成此操作的更多信息,请访问:https://stackoverflow.com/a/12342937/4747587