在调用finish()然后重新打开应用程序时,我得到了上面的错误。下面是管理导航onBackPressed()的代码。
android.app.FragmentManager settingsFragmentManager = getFragmentManager();
FragmentManager fragmentManager = getSupportFragmentManager();
if (settingsFragmentManager.getBackStackEntryCount() > 0)
settingsFragmentManager.popBackStackImmediate();
else if (fragmentManager.getBackStackEntryCount() > 0)
fragmentManager.popBackStackImmediate();
if (fragmentManager.getBackStackEntryCount() == 0 && endIfEmpty) finish();
if (fragmentManager.getBackStackEntryCount() == 0 && !endIfEmpty) loadView(0);
if (fragmentManager.getBackStackEntryCount() == 0 && !userHasLoggedIn)
{
LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(loginBroadcastReceiver);
finish();
}loadView调用的方法负责根据用户选择的内容添加片段。当使用0作为参数来调用它时,它会添加默认片段。
这就是方法:
private void loadView(int position)
{
FragmentManager fragmentManager = getSupportFragmentManager();
Bundle fragmentArgs = new Bundle();
if (drawerOpened)
mDrawerLayout.closeDrawer(drawerHolderLayout);
switch (position) {
case 0:
ProfileEditFragment activityList = new ProfileEditFragment();
fragmentArgs.clear();
fragmentArgs.putString(ProfileEditFragment.ARG_AGENT_ID, String.valueOf(prefClass.getAgentId()));
fragmentArgs.putString(ProfileEditFragment.ARG_USERNAME, prefClass.getUsername());
fragmentArgs.putString(ProfileEditFragment.ARG_PASSWORD, prefClass.getHashedPassword());
fragmentArgs.putInt(ProfileEditFragment.ARG_OPERATION, ProfileEditFragment.LOAD_ALL_DATA);
activityList.setArguments(fragmentArgs);
fragmentManager.beginTransaction().add(R.id.main_activity_content, activityList).addToBackStack(null).commit();
//activityList.retrieveActivityFromServer(ProfileEditFragment.LOAD_ALL_DATA);
break;
}
}执行以下代码行时会发生异常:
fragmentManager.beginTransaction().add(R.id.main_activity_content, activityList).addToBackStack(null).commit();但是,在第一次启动应用时,不会出现此异常。只有在调用finish()之后重新启动它时,它才会出现。值得一提的是,添加的第一个片段是一个LoginFragment。登录过程完成后,将调用popBackstack,后台堆栈变为空,并调用loadView(0)。那么,为什么在调用loadView时它会崩溃,但在添加LoginFragment时却没有呢?
提前谢谢。
发布于 2018-08-21 00:10:54
在我的例子中,我在应用程序移到后台后打开了一个DialogFragment。
你可以这样模拟这个状态:打开一个请求,运行Thread.sleep(2000),快速地在智能手机上按“关机”(或按“菜单”按钮),然后“开机”(或打开应用程序)。如果请求出现错误,并显示日志,则会写入DialogFragment:java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState,对应的行为dialogFragment.show(supportFragmentManager, TAG)。
我尝试了一个解决方案https://stackoverflow.com/a/22414366/2914140,它工作得很好,但包含这个错误。因此,再添加一项检查:
if (supportFragmentManager?.isStateSaved == false) {
dialogFragment.show(supportFragmentManager, TAG)
}在这种情况下,在关闭屏幕并打开后,您将根本看不到此对话框(遗憾地说),但您的应用程序不会崩溃。
更新
对不起,旧的答案已经过时了。参见On showing dialog i get "Can not perform this action after onSaveInstanceState"。
public class CustomDialogFragment extends DialogFragment {
@Override
public void show(FragmentManager manager, String tag) {
try {
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commit();
} catch (IllegalStateException e) {
}
}
}在这种情况下,将显示对话框片段。
https://stackoverflow.com/questions/28288311
复制相似问题