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

标签 android android-fragments fragmentmanager

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

我读过这篇关于 fragment 事务和生命周期的精彩文章,但我不确定如何在我的代码中处理它。我知道我不应该在 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()

最佳答案

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

关于android - 我如何知道是否已调用 onSaveInstanceState() 以便我可以避免 IllegalStateException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33616231/

相关文章:

Android:防止 fragment 在替换另一个 fragment 时变为 "active"

javascript - 在 Javascript 中模拟长按

android - 销毁从 BroadcastReceiver 开始的 Activity

android - MVP和Android处理Lifecycle事件,UI逻辑在哪里做

android - 具有不同菜单和常用工具栏的 Viewpager 不起作用

android - 在单个 fragment 事务中添加多个返回堆栈条目

java - 从 servlet 生成 JSON

android - 数据库更新后更新 fragment TextView

android - 膨胀类 android.support.v7.app.AlertController.RecycleListView 时出错

android - 即使在添加 addToBackStack 和 executePendingTransactions() 之后 getBackStackEntryCount() 也总是返回 0