2013-09-30 9 views
15

प्रथम में सूचकांक को मंजूरी दी है, मेरे ऐप इस तरह संरचना है:java.lang.IllegalStateException: विफल राज्य की बचत: सक्रिय टुकड़ा

SpashActivity -> MainActivity -> switching between many fragments 

मेरा ऐप उपयोग SlideMenu टुकड़े के बीच स्विच करने के लिए। मुझे replace के बजाय खंड स्थिति रखने के लिए attach का उपयोग करना होगा। यह की तरह लग रहा है:

@Override 
public void onBackPressed() { 
    if (0 == getSupportFragmentManager().getBackStackEntryCount()) { 
     // show confirm exit dialog. 
     // If user press ok, try to exit, the splash activity will call finish() 
     // if(dialog == ok){ 
      Intent intent = new Intent(MainActivity.this, SplashActivity.class); 
      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      intent.putExtra(SplashActivity.EXIT_KEY, true); 
      startActivity(intent); 
     // } 
    } else { 
     super.onBackPressed(); 
    } 
} 

लेकिन कभी कभी (हमेशा) मैं अपवाद हो गया और मेरे ऐप जब दुर्घटना:

public void switchContent(int index, String fragmentTag) {     
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    if (fragmentManager.findFragmentByTag(fragmentTag) != mContent) { 
     if (!mContent.isDetached()) { 
      transaction.detach(mContent); 
     } 
     if (null == fragmentManager.findFragmentByTag(fragmentTag)) { 
      switch (index) { 
      case 0: 
       mContent = new CategoryFragment(); 
       break; 
      case 1: 
       mContent = new BookFragment(); 
       break; 
      case 2: 
       mContent = new BookDetailFragment(); 
       break; 
      // etc 
      } 
     } else { 
       mContent = fragmentManager.findFragmentByTag(fragmentTag);    
     } 

     if (mContent.isDetached()) { 
      transaction.attach(mContent); 
     } else if (!mContent.isAdded()) { 
      transaction.add(R.id.content_frame, mContent, fragmentTag); 
     } 

     transaction.addToBackStack(null); 
     transaction.commit(); 
     fragmentManager.executePendingTransactions(); 
    } 
    Handler h = new Handler(); 
    h.postDelayed(new Runnable() { 
     public void run() { 
      getSlidingMenu().showContent(); 
     } 
    }, 50); 
} 

जब वापस ढेर शून्य करने के लिए उलटी गिनती, मेरे ऐप बाहर निकलने के लिए है वापस कई बार उपयोगकर्ता प्रेस (यहां तक ​​कि इस बात की पुष्टि के लिए बाहर निकलें संवाद प्रकट नहीं - इसका मतलब यह वापस ढेर गिनती शून्य से अधिक):

09-30 20:32:53.419: E/AndroidRuntime(796): Uncaught handler: thread main exiting due to uncaught exception 
    09-30 20:32:53.470: E/AndroidRuntime(796): java.lang.RuntimeException: Unable to pause activity {com.org.scgroup/com.org.scgroup.MainActivity}: java.lang.IllegalStateException: Failure saving state: active BookDetailFragment{43e7e0d8} has cleared index: -1 
    09-30 20:32:53.470: E/AndroidRuntime(796): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3162) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3119) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3102) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at android.app.ActivityThread.access$2400(ActivityThread.java:119) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1870) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at android.os.Handler.dispatchMessage(Handler.java:99) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at android.os.Looper.loop(Looper.java:123) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at android.app.ActivityThread.main(ActivityThread.java:4363) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at java.lang.reflect.Method.invokeNative(Native Method) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at java.lang.reflect.Method.invoke(Method.java:521) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at dalvik.system.NativeStart.main(Native Method) 
    09-30 20:32:53.470: E/AndroidRuntime(796): Caused by: java.lang.IllegalStateException: Failure saving state: active BookDetailFragment{43e7e0d8} has cleared index: -1 
    09-30 20:32:53.470: E/AndroidRuntime(796): at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1716) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:532) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at com.actionbarsherlock.app.SherlockFragmentActivity.onSaveInstanceState(SherlockFragmentActivity.java:126) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity.onSaveInstanceState(SlidingFragmentActivity.java:51) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at com.org.scgroup.MainActivity.onSaveInstanceState(MainActivity.java:324) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at android.app.Activity.performSaveInstanceState(Activity.java:1022) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1180) 
    09-30 20:32:53.470: E/AndroidRuntime(796): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3144) 
    09-30 20:32:53.470: E/AndroidRuntime(796): ... 12 more 

onSaveInstanceState metho डी:

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    try { 
     Ln.d("onSaveInstanceState"); 
     outState.putInt(CURRENT_FRAGMENT_KEY, currentFragment); 

     if (0 < getSupportFragmentManager().getBackStackEntryCount()) { 
      getSupportFragmentManager().putFragment(outState, "mContent", mContent); 
     } 
    } catch (Exception ex) { 
     Ln.e(ex); 
    } 
} 

क्या आप कृपया मुझे बता सकते हैं कि मैं कहां गलत हूं? अग्रिम में धन्यवाद।

+0

आप इस समस्या के लिए किसी भी समाधान मिला:

कुछ इस तरह का उपयोग करने का प्रयास करें? –

+1

नहीं, मैं समझता हूं कि जब मैं टुकड़े को अलग करने और जोड़ने के बजाय प्रतिस्थापन का उपयोग करता हूं, तो यह त्रुटि नहीं होती है। – R4j

+0

मुझे यह नहीं लगता कि यह समाधान है, मेरे मामले में, मैं इस त्रुटि के साथ एक प्रतिस्थापन लेनदेन को खत्म कर देता हूं:/ – letroll

उत्तर

0

@Override 
public void onBackPressed() { 
    if (0 == getSupportFragmentManager().getBackStackEntryCount()) { 

को

@Override 
public void onBackPressed() { 
    if (getSupportFragmentManager().getBackStackEntryCount() < 1) { 

बदलने के लिए मुझे आशा है कि यह काम करता है

+0

मेरे लिए बग ठीक नहीं करता है ... – Virthuss

0

अपने टुकड़े की राज्य स्वचालित रूप से सहेजा और पुनर्स्थापित किया जाता है, कुछ भी करने की कोई जरूरत नहीं है की कोशिश अपने onSaveInstanceState विधि। अपनी गतिविधि में अपने टुकड़ों के किसी भी संदर्भ को न रखें (आपके मामले में currentFragment, mContent), यदि आपको एक निश्चित टुकड़े की आवश्यकता है, तो इसे FragmentManager से प्राप्त करें। findFragmentByTag

0

अलग करने और संलग्नक के बीच खंड की स्थिति पढ़ने के साथ संभावित समस्या।

FragmentTransaction ft = fragmentManager.beginTransaction(); 

//ft.detach(fragment).attach(fragment).commitAllowingStateLoss(); // crashing 

ft.replace(getView().getId(), fragment).commitAllowingStateLoss(); // not crashing 
संबंधित मुद्दे