2012-07-12 5 views
7

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) 

답변

10

어쨌든 이런 종류의 문제가 발견되었습니다. 난 그냥 대신 onNewIntent의 onResume에서 탭을 전환 :

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

그리고 onNewIntent에서

은() 난 그냥 switchToTab = true를 설정합니다. 누군가에게 더 나은 해결책이 있기를 바랍니다.

+1

나는 똑같은 문제가 있었다. Sharlock 자체가 ft.commit()을 호출하지만, 두 번 커밋 할 수는 없지만 ft.commitAllowingStateLoss()를 추가하여 ActionBar.TabListener 구현을 해킹하려고 노력했습니다. 또한 http://stackoverflow.com/a/10261438/245345에서 답변을 시도했지만 도움이되지 않습니다. 마지막으로 나는 잘 작동하는 해결책을 찾았습니다. 감사. –

0

onTabSelected 메소드에서 커밋을 호출하면 안됩니다. 그것은 프레임 워크에 의해 이미 완료되었습니다.

아,받은 트랜잭션을 사용하고 새 트랜잭션을 생성하지 마십시오.

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는 Google 예제의 토큰 이었으므로 정확하다고 생각합니다. 내가받은 거래를 사용한다는 것은 무엇을 의미합니까? – Wizche

+0

커밋/beginTransaction 정상적인 경우 작동하지만 여전히 재개 후 스위치 탭에서 나에게 동일한 예외를 제공하는 경우 업데이트를 주셔서 감사합니다, getSupportFragmentManager() 여러 플랫폼 (지원 라이브러리 사용), 지원해야합니다. FragmentManager가 아직 준비되지 않았기 때문에 onNewIntent 메서드에서이 작업을 수행 할 수 없다고 가정합니다. – Wizche