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)
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. –