我如何知道是否已调用onSaveInstanceState()以便我可以避免IllegalStateException?

时间:2015-11-09 18:59:46

标签: android android-fragments fragmentmanager

当用户选择导航抽屉中的某个项目时,我的应用程序会启动一个处理程序,在等待抽屉关闭后,调用代码来替换主Activity中的片段。但是,如果设备在延迟期间已经旋转,我会收到IllegalStateException。

我已经阅读了这篇关于片段交易和生命周期的精彩文章,但我不确定如何在我的代码中处理这个问题。我知道我不应该在onSaveInstanceState()之后尝试提交交易。但我如何知道是否已调用onSaveInstanceState()?我想做这样的事情。

navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(final MenuItem menuItem) {
        // close drawers
        drawerLayout.closeDrawers();

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                goTo(menuItem); // swap in Fragment specified by menuItem
            }
        }, 300);
        return true;
    }
    });
...
private void goTo(menuItem) {
    if( alreadyCalledOnSaveInstanceState() {  // THIS
        return;
    }

    switch (item.getItemId()) {
        case R.id.item1:
            frag = new Fragment_Grade_Calculator();
            getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_in_up, R.anim.zoom_exit).replace(R.id.main_frag_container, frag)
                    .commit();
            return true;
}

但我不知道我的化妆品alreadyCalledOnSaveInstanceState()的等价物。

2 个答案:

答案 0 :(得分:0)

我认为你不应该使用onSaveInstanceState(),而应该使用onStop()。并且在调用onStop()之后不提交事务。并且不要忘记在调用onStart()之后允许提交事务。

答案 1 :(得分:0)

据我所知,onSaveInstanceState() 永远不会在 onPause() 之前被调用。因此,只要您在恢复状态下提交片段事务,您就应该不会遇到 IllegalStateException。