2017-10-17 7 views
0

私のアプリケーションでは、ボトムバーメニューを使用しています。メニューをすばやく選択すると、クラッシュレポートの次のクラッシュレポートが表示されます(一部のデバイスのみ)。 java.lang.IllegalStateException:android.support.v4.app.FragmentManagerImpl.checkStateLossでonSaveInstanceState 後 このアクションを実行することはできません(FragmentManager.java:1842ここで非致命的な例外popBackStackの不正な状態の例外

スタックトレースがあります) android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1860) android.support.v4.app.FragmentManagerImpl.popBackStack(FragmentManager.java:781) at com.beco.ibeco.app .MainActivity $ 1.onMenuTabSelected(MainActivity.java:87) at com.beco.ibeco.app.views.bottombar.BottomBar.notifyMenuListener(BottomBar.java:1239) at com.beco.ibeco.app.views.bottombar.BottomBar.updateSelectedTab(BottomBar.java:1199) (com.beco.ibeco.app.views.bottombar.BottomBar.handleClick(BottomBar.java:1161) at) android.view.View $ PerformClick.runでcom.beco.ibeco.app.views.bottombar.BottomBar.onClick(BottomBar.java:1149)android.view.View.performClick(View.java:5076)で ( View.java:20279) (android.os.Handler.handleCallback(Handler.java:739) (android.os.Handler.dispatchMessage(Handler.java:95)) にandroid.os.Looper.loop(Looper。 java:135)android.app.ActivityThread.main(ActivityThread.java:5930) at java.lang.reflect.Method.invoke(Method.java) at java.lang.refl ect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1405) at com.android.internal.os.ZygoteInit.main(ZygoteInit。 Javaの:1200)
そしてここでは、コード

protected void onCreate(Bundle savedInstanceState) { 
     mActive = true; 
     super.onCreate(savedInstanceState); 
     initBottomBar(savedInstanceState); 
     Intent intent = getIntent(); 
    } 
private void initBottomBar(Bundle savedInstanceState) { 
     mBottomBar = BottomBar.attach(this, savedInstanceState); 
     mBottomBar.useFixedMode(); 
     mBottomBar.noTabletGoodness(); 
     mBottomBar.setItemsFromMenu(R.menu.bottombar_menu, new OnMenuTabClickListener() { 
      @Override 
      public void onMenuTabSelected(@IdRes int menuItemId) { 

       FragmentManager fragmentManager = getSupportFragmentManager(); 
       fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);//line 87 

       switch (menuItemId) { 

        case R.id.bottomBarHome: 
         showStoreList(); 
         break; 

        case R.id.bottomBarMap: 
         showMap(); 
         break; 

        case R.id.bottomBarDeal: 
         showDeals(); 
         break; 

        case R.id.bottomBarSettings: 
         showSettings(); 
         break; 

        case R.id.bottomBarNotification: 
         if (mNotificationBadge != null) { 
          mNotificationBadge.hide(); 
          Beco.getApp().clearBadge(); 
         } 
         showNotifications(); 
         break; 
       } 
      } 

      @Override 
      public void onMenuTabReSelected(@IdRes int menuItemId) { 
       switch (menuItemId) { 
        case R.id.bottomBarHome: 
         if (mCurrentTab != HOME) 
          showStoreList(); 
         break; 

        case R.id.bottomBarMap: 
         if (mCurrentTab != MAP) 
          showMap(); 
         break; 

        case R.id.bottomBarDeal: 
         if (mCurrentTab != DEAL) 
          showDeals(); 
         break; 

        case R.id.bottomBarNotification: 
         if(mCurrentTab != NOTIFICATION) { 
          if (mNotificationBadge != null) { 
           mNotificationBadge.hide(); 
           mNotificationBadge.setDealItemCount(0); 
           Beco.getApp().clearBadge(); 
          } 
          showNotifications(); 
         } 
         break; 

        case R.id.bottomBarSettings: 
         if (mCurrentTab != SETTINGS) 
          showSettings(); 
         break; 
       } 
      } 
     }); 

     mNotificationBadge = mBottomBar.makeBadgeForTabAt(3, R.color.beco_badge_color, Beco.getApp().getBadgeCount()); 
    } 
@Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     mBottomBar.onSaveInstanceState(outState); 
    } 

どのように私はこの問題を上書きすることができますか?

+0

[saveInstanceState後popBackStack()()]の可能な重複(HTTPS onpauseするつもりはないかどうかをチェック:/をあなたはブール値を削除したい場合/stackoverflow.com/questions/7474882/popbackstack-after-saveinstancestate) –

答えて

2

ブールを作成し、活性が

@Override 
public void onResume() { 
    super.onResume(); 
    mIsResumed = true; 
} 

@Override 
public void onPause() { 
    mIsResumed = false; 
    super.onPause(); 
} 

次いでフラグメントチェックのロード中

if(mIsResumed){ 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);//line 8 
} 
+0

ニースきれいな解決策は、あなたがhttps://developer.android.com/topic/libraries/architecture(ライフサイクルは助けることができるかもしれません/lifecycle.html)。彼らと遊ぶチャンスはありませんでしたが、私は彼らがこのようなことの必要性を取り除くことを望んでいました。 –

+0

はい...ブール値は、アクティビティやクラスに固有なので、簡単で簡単なソリューションです...フラグメントトランザクションを実行しているときにアプリケーションがonPauseに移行するかどうかを確認するさまざまなソリューションがあります。アプリケーションクラスのサイクルコールバックも機能します。 – Anonymous

関連する問題