java - 切换选项卡 onNewIntent 导致 IllegalStateException

标签 java android fragment actionbarsherlock

如果我尝试在 onNewIntent 方法中切换导航选项卡,我的 FragmentActivity(singleTop) 会出现 IllegalStateException。

更具体地说,我的应用程序使用 SherlockActionBar 和三个选项卡,一个选项卡在收到推送通知(并调用 Intent )时更新,如果应用程序在另一个选项卡上暂停,当我收到 Intent 时(在 onNewIntent 中) ) 我使用 bar.setSelectedNavigationItem() 将选项卡(以及 fragment )更改为第三个选项卡,这导致了我的问题。如果应用程序在第三个选项卡上暂停,则不会发生异常。

代码:

@Override
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            bar.setSelectedNavigationItem(Utils.ORDER_STATUS_TAB_ID);
        } else {
        }
    } 

推送通知 Intent :

    Intent notificationIntent = new Intent(context,
            MainActivity.class);
    notificationIntent.putExtra("orderUpdate",
            new Gson().toJson(orderUpdate));
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
            | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
            notificationIntent, 0);

    notification.contentIntent = contentIntent;

TabListener 方法(堆栈跟踪中第 56 行的注释)

@Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft = activity.getSupportFragmentManager().beginTransaction();
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        if (mFragment == null) {
            mFragment = Fragment
                    .instantiate(activity, mClass.getName(), mArgs);
            ft.add(android.R.id.content, mFragment, tag);
            ft.commit();
        } else {
            ft.attach(mFragment);
            ft.commit(); // line 56
        }

详细异常:

07-12 20:06:40.959: E/AndroidRuntime(8639): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
07-12 20:06:40.959: E/AndroidRuntime(8639):     at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299)
07-12 20:06:40.959: E/AndroidRuntime(8639):     at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310)
07-12 20:06:40.959: E/AndroidRuntime(8639):     at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
07-12 20:06:40.959: E/AndroidRuntime(8639):     at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)
07-12 20:06:40.959: E/AndroidRuntime(8639):     at com.wizche.ui.MyTabListener.onTabSelected(MyTabListener.java:56)
07-12 20:06:40.959: E/AndroidRuntime(8639):     at com.actionbarsherlock.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java:526)
07-12 20:06:40.959: E/AndroidRuntime(8639):     at com.actionbarsherlock.internal.app.ActionBarImpl.setSelectedNavigationItem(ActionBarImpl.java:317)
07-12 20:06:40.959: E/AndroidRuntime(8639):     at com.wizche.MainActivity.onNewIntent(MainActivity.java:205)

最佳答案

我找到了解决这个问题的办法,反正有点难看。我只是在 onResume 而不是 onNewIntent 中切换选项卡:

    @Override
    public void onResume() {
        super.onResume();
        if(switchToTab){
            bar.setSelectedNavigationItem(Utils.ORDER_STATUS_TAB_ID);
            switchToTab = false;
        }
     }

在 onNewIntent() 中,我只是设置了 switchToTab = true。我希望有人会提出更好的解决方案。

关于java - 切换选项卡 onNewIntent 导致 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11458149/

相关文章:

java - 如何使用 lambda 在 Java 中实现两个抽象方法?

android - 如何控制 Android ImageSwitcher 中的过渡持续时间

android - 自定义适配器不显示数据

android - 后台ListView接收输入(Fragment API)

android - 为 Activity 或分别为每个 fragment 制作一个工具栏?

java - 有没有办法提高FlyingSaucer的性能?

java - 调用 repaint() 而不丢失先前的图形

android - 可以创建一个有两个可点击区域的按钮吗?

java - Jersey - 使用上下文确定 "@Produces"?

android - Eclipse 中的 Joda 时间 : NoClassDefFoundError