7

onNewIntentメソッドでナビゲーションタブを切り替えようとすると、FragmentActivity(singleTop)によってIllegalStateExceptionが発生します。

具体的には、アプリケーションは3つのタブを持つSherlockActionBarを使用します。プッシュ通知を受信すると(およびインテントが呼び出されると)、1つのタブが更新されます。アプリが別のタブで一時停止された場合、インテントを受信すると(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)
4

2 に答える 2

11

とにかく醜い、これに対する修正を見つけました。onNewIntentではなくonResumeのタブを切り替えるだけです。

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

そして、onNewIntent()で、switchToTab=trueを設定しました。誰かがより良い解決策を持ってくることを願っています。

于 2012-07-12T19:04:29.767 に答える
0

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

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

 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
    }
于 2012-07-12T18:25:34.233 に答える