2013-09-30 17 views
15

Thứ nhất, ứng dụng của tôi có cấu trúc như thế này:java.lang.IllegalStateException: Không tiết kiệm nhà nước: hoạt động đã xóa chỉ mục trong đoạn

SpashActivity -> MainActivity -> switching between many fragments 

Ứng dụng của tôi sử dụng SlideMenu để chuyển đổi giữa các mảnh vỡ. Tôi phải sử dụng attach thay vì replace để giữ trạng thái phân đoạn. Nó trông giống như:

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); 
} 

Khi chồng trở lại đếm ngược tới zero, ứng dụng của tôi có để thoát:

@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(); 
    } 
} 

Nhưng đôi khi (không phải luôn luôn) Tôi đã nhận các ngoại lệ và sụp đổ ứng dụng của tôi khi người dùng nhấn lại nhiều lần (ngay cả hộp thoại xác nhận thoát không xuất hiện - nghĩa là số lượng ngăn xếp lớn hơn số không):

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 d:

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

Bạn có thể cho tôi biết tôi đã sai ở đâu không? Cảm ơn trước.

+0

Bạn có tìm thấy bất kỳ giải pháp cho vấn đề này? –

+1

Không, tôi chỉ tìm ra khi tôi sử dụng thay thế thay vì tách và đính kèm đoạn, lỗi này không xảy ra. – R4j

+0

Tôi không nghĩ đó là giải pháp, trong trường hợp của tôi, tôi thực hiện thay thế giao dịch whick kết thúc với lỗi này quá:/ – letroll

Trả lời

0

Cố gắng thay đổi

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

để

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

Tôi hy vọng công trình này

+0

Không sửa lỗi cho tôi ... – Virthuss

0

Tình trạng của mảnh vỡ của bạn được tự động lưu và phục hồi, không có cần phải làm bất cứ điều gì trong bạn onSaveInstanceState phương pháp. Không giữ bất kỳ tham chiếu nào đến Phân đoạn của bạn trong Hoạt động của bạn (trong trường hợp của bạn là currentFragment, mContent), nếu bạn cần một Mảnh vỡ nhất định, hãy lấy nó từ FragmentManager bằng ví dụ: findFragmentByTag.

0

Có thể có vấn đề với chỉ số phân đoạn đọc giữa tách và đính kèm.

Hãy thử sử dụng một cái gì đó như thế này:

FragmentTransaction ft = fragmentManager.beginTransaction(); 

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

ft.replace(getView().getId(), fragment).commitAllowingStateLoss(); // not crashing 
Các vấn đề liên quan