2012-07-12 14 views
7

OnNewIntent yönteminde gezinme sekmesini değiştirmeyi denediğimde, FragmentActivity (singleTop) bana IllegalStateException veriyor.Anahtar sekmesiNewIntent nedeni IllegalStateException

Daha açık söylemek gerekirse, Uygulamam, üç sekmeyle birlikte SherlockActionBar'ı kullanır, bir alma bildirimi alındığında (ve niyet çağrıldığında) bir sekme güncellenir; onNewIntent) Sekmeyi (ve dolayısıyla parçayı) bar.setSelectedNavigationItem() ile üçüncü sekmeye değiştiriyorum ve bu bana sorun yaratıyor. Uygulama üçüncü sekmede askıya alındıysa, istisna gerçekleşmez.

Kodu:

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

push bildirim niyet:

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 yöntemi

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

detaylı istisna (stacktrace hat 56 üzerinde yorum ile) :

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) 

cevap

10

Bunun için bir düzeltme buldum, her neyse çirkin. Sadece yerine onNewIntent arasında onResume sekmesini geçiş:

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

Ve onNewIntent içinde

() Ben sadece switchToTab = true olarak ayarlayın. Umarım birisi daha iyi bir çözümle gelir.

+1

Aynı sorunu yaşadım. Bir ft.commitAllowingStateLoss() ekleyerek, ActionBar.TabListener uygulamasını hacklemek için çok çalışıyordum, ancak Sharlock'un kendisi de ft.commit() işlevini çağırır, iki kez işlenemez. Ayrıca http://stackoverflow.com/a/10261438/245345 adresindeki cevabı da denedim, ancak yardımcı olmayacak. Sonunda iyi çalışan çözümünüzü buldum. Teşekkürler. –

0

Sanırım onTabSelected yönteminde taahhüt etmemelisiniz. Bu zaten çerçeve tarafından yapıldı.

Aldığınız işlemi kullanın ve yeni bir tane oluşturma.

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 örneğinden belirteçti, bu yüzden doğru olduğunu varsayalım. Aldığım işlemi kullanmak için ne demek istiyorsun? – Wizche

+0

Güncelleştirme için teşekkürler, getSupportFragmentManager() birden fazla platformu desteklemek için orada olmalı (Destek Kitaplığı'nı kullanırım), eğer normalde çalışmayı başlat/beginTransaction'ı kaldırırsam ancak yine de devam edildikten sonra geçiş sekmesinde aynı özel durumu verirseniz. FragmentManager henüz hazır olmadığından, bu eylemi onNewIntent yönteminden gerçekleştiremediğimi kabul ediyorum. – Wizche

İlgili konular