2012-07-12 32 views
7

My FragmentActivity (singleTop) đang cho tôi IllegalStateException nếu tôi cố gắng chuyển tab điều hướng trong phương thức onNewIntent.Tab chuyển đổi trênMớiTính năng nguyên nhân IllegalStateException

Cụ thể hơn, Ứng dụng của tôi sử dụng SherlockActionBar với ba tab, một tab được cập nhật khi nhận được thông báo đẩy (và ý định được gọi), nếu ứng dụng bị treo trên tab khác, khi tôi nhận được ý định (trong onNewIntent) Tôi thay đổi các tab (và do đó các mảnh) vào tab thứ ba với bar.setSelectedNavigationItem() và điều này gây ra cho tôi vấn đề. Nếu ứng dụng bị tạm ngưng trên tab thứ ba, không có ngoại lệ nào xảy ra.

Code:

@Override 
    public void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     Bundle bundle = intent.getExtras(); 
     if (bundle != null) { 
      bar.setSelectedNavigationItem(Utils.ORDER_STATUS_TAB_ID); 
     } else { 
     } 
    } 

Thông báo push ý:

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; 

Phương pháp TabListener (với những nhận xét trên dòng 56 trong stacktrace)

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

Ngoại lệ chi tiết :

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) 

Trả lời

10

Tôi đã tìm thấy bản sửa lỗi cho loại này, dù sao cũng xấu xí. Tôi chỉ chuyển đổi các tab trong onResume thay vì onNewIntent:

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

Và trong onNewIntent() Tôi chỉ cần thiết lập các switchToTab = true. Tôi hy vọng một người nào đó sẽ đến với một giải pháp tốt hơn.

+1

Tôi gặp vấn đề tương tự. Tôi đã cố gắng hacking việc thực hiện ActionBar.TabListener, thêm một ft.commitAllowingStateLoss(), tuy nhiên Sharlock nó cũng sẽ gọi ft.commit(), nó không thể được cam kết hai lần. Tôi cũng đã thử câu trả lời tại http://stackoverflow.com/a/10261438/245345, nhưng nó sẽ không giúp ích gì. Cuối cùng tôi tìm thấy giải pháp của bạn, hoạt động tốt. Cảm ơn. –

0

Tôi nghĩ bạn không nên gọi cam kết trong phương thức onTabSelected. Nó đã được thực hiện bởi khuôn khổ rồi.

Ồ, và sử dụng giao dịch bạn nhận được, không tạo giao dịch mới.

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 là mã thông báo từ ví dụ của Google vì vậy tôi cho là chính xác. Ý bạn là gì khi sử dụng giao dịch tôi nhận được? – Wizche

+0

Cảm ơn bạn đã cập nhật, getSupportFragmentManager() nên ở đó để hỗ trợ nhiều nền tảng (tôi sử dụng Thư viện Hỗ trợ), nếu tôi xóa commit/beginTransaction nó hoạt động trong trường hợp bình thường nhưng vẫn cho tôi ngoại lệ tương tự trên tab chuyển đổi sau khi tiếp tục. Tôi cho rằng tôi không thể thực hiện hành động này từ phương thức onNewIntent vì FragmentManager chưa sẵn sàng. – Wizche

Các vấn đề liên quan