onNewIntent 메서드에서 탐색 탭을 전환하려고하면 My FragmentActivity (singleTop)에서 IllegalStateException을 발생시킵니다.스위치 탭 onNewIntent 원인 IllegalStateException
더 구체적으로 말하면, 내 응용 프로그램은 3 개의 탭이있는 SherlockActionBar를 사용합니다. 푸시 알림을 받으면 (의도가 호출되면) 하나의 탭이 업데이트되고, 다른 탭에서 응용 프로그램이 일시 중지되면 onNewIntent) bar.setSelectedNavigationItem()을 사용하여 탭 (따라서 조각)을 세 번째 탭으로 변경하면 이로 인해 문제가 발생합니다. 앱이 세 번째 탭에서 일시 중지 된 경우 예외가 발생하지 않습니다.
번호 :
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Bundle bundle = intent.getExtras();
if (bundle != null) {
bar.setSelectedNavigationItem(Utils.ORDER_STATUS_TAB_ID);
} else {
}
}
푸시 통지 의도 :
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;
TabListener 방법
@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
}
상세한 예외 (스택 트레이스의 라인 (56)에 주석으로) :
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)
나는 똑같은 문제가 있었다. Sharlock 자체가 ft.commit()을 호출하지만, 두 번 커밋 할 수는 없지만 ft.commitAllowingStateLoss()를 추가하여 ActionBar.TabListener 구현을 해킹하려고 노력했습니다. 또한 http://stackoverflow.com/a/10261438/245345에서 답변을 시도했지만 도움이되지 않습니다. 마지막으로 나는 잘 작동하는 해결책을 찾았습니다. 감사. –