首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ANDROID - java.lang.IllegalStateException:在onSaveInstanceState之后无法执行此操作

ANDROID - java.lang.IllegalStateException:在onSaveInstanceState之后无法执行此操作
EN

Stack Overflow用户
提问于 2015-02-03 06:49:23
回答 1查看 2.7K关注 0票数 2

在调用finish()然后重新打开应用程序时,我得到了上面的错误。下面是管理导航onBackPressed()的代码。

代码语言:javascript
复制
        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作为参数来调用它时,它会添加默认片段。

这就是方法:

代码语言:javascript
复制
    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;
        }
    }

执行以下代码行时会发生异常:

代码语言:javascript
复制
fragmentManager.beginTransaction().add(R.id.main_activity_content, activityList).addToBackStack(null).commit();

但是,在第一次启动应用时,不会出现此异常。只有在调用finish()之后重新启动它时,它才会出现。值得一提的是,添加的第一个片段是一个LoginFragment。登录过程完成后,将调用popBackstack,后台堆栈变为空,并调用loadView(0)。那么,为什么在调用loadView时它会崩溃,但在添加LoginFragment时却没有呢?

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 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,它工作得很好,但包含这个错误。因此,再添加一项检查:

代码语言:javascript
复制
if (supportFragmentManager?.isStateSaved == false) {
    dialogFragment.show(supportFragmentManager, TAG)
}

在这种情况下,在关闭屏幕并打开后,您将根本看不到此对话框(遗憾地说),但您的应用程序不会崩溃。

更新

对不起,旧的答案已经过时了。参见On showing dialog i get "Can not perform this action after onSaveInstanceState"

代码语言:javascript
复制
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) {
        }
    }
}

在这种情况下,将显示对话框片段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28288311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档