2012-07-12 13 views
7

onNewIntentメソッドのナビゲーションタブを切り替えると、私のFragmentActivity(singleTop)がIllegalStateExceptionを送出しています。スイッチタブonNewIntent原因IllegalStateException

具体的には、私のアプリケーションでは、3つのタブを持つSherlockActionBarを使用しています。プッシュ通知を受け取ったとき(およびインテントが呼び出されたとき)、アプリケーションが別のタブで中断された場合、 onNewIntent)bar.setSelectedNavigationItem()を使用してタブ(したがってフラグメント)を3番目のタブに変更すると、これが問題の原因になります。アプリが3番目のタブで中断された場合、例外は発生しません。

コード:

@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 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) 

答えて

10

とにかく醜いものが見つかりました。私はonResumeの代わりonNewIntentでタブを切り替える:

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

そしてonNewIntent(中)私はちょうど真switchToTab =を設定します。私は、誰かがより良い解決策を提供することを願っています。

+1

私は非常に同じ問題を抱えていました。私は、ActionBar.TabListenerの実装をハッキングしようとしていましたが、ft.commitAllowingStateLoss()を追加しましたが、Sharlock自身もft.commit()を呼び出します.2回コミットすることはできません。私もhttp://stackoverflow.com/a/10261438/245345で回答を試みましたが、それは役に立たないでしょう。最後に、あなたの解決策を見つけました。これはうまくいきます。ありがとう。 –

0

あなたはonTabSelectedメソッドでコミットを呼び出すべきではないと思います。既にフレームワークによって行われています。

ああ、受信したトランザクションを使用して、新しいトランザクションを作成しないでください。

public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    //remove the first line 
    //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); 
     //not sure about this one 
     ft.commit(); 
    } else { 
     ft.attach(mFragment); 
     //not sure about this one neither 
     ft.commit(); // line 56 
    } 
+0

TabListenerはGoogleの例のトークンだったので、正しいと思います。私が受け取った取引を使用することはどういう意味ですか? – Wizche

+0

コミット/ beginTransactionを削除しても通常の場合でもgetSupportFragmentManager()が複数のプラットフォーム(サポートライブラリを使用)をサポートするはずですが、再開後もスイッチのタブで同じ例外が表示されます。私は、FragmentManagerがまだ準備ができていないので、onNewIntentメソッドからこのアクションを実行できないと仮定します。 – Wizche

関連する問題