我在市场上有一个应用程序,我得到以下例外:
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
包。
答案 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