2015-12-29 33 views
5

próbuję zastąpić fragment w onActivityResult() ale zawsze daje mi błąd java.lang.illegalStateException.onActivityResult() Błąd transakcja fragment

Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime:  at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1377) 
12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime:  at  android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1395) 
12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime:  at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:637) 
12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime:  at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:616) 
12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime:  at .virtualClass.VirtualPurchaseFragment.dealWithSuccessfulPurchase(VirtualPurchaseFragment.java:161) 

Oto mój kod onActivityResult

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    Fragment fragment = new VirtualListFragment(); 
    FragmentManager fragmentManager = getFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit(); 

} 
+0

spróbować transaction.commitAllowingStateLoss(); –

+0

Próbowałem tego, to nie zastępuje fragmentu, zamiast pokazywania pustego fragmentu w tym miejscu –

+0

możesz sprawdzić [to] (http://stackoverflow.com/questions/14177781/java-lang-illegalstateexception-can-not-perform -this-action-after-onsaveinstanc), [this] (http://stackoverflow.com/questions/7575921/illegalstateexception-can-not-perform-thisaction- after-inventinstance-wit), [this] (http : //stackoverflow.com/questions/7469082/getting-exception-ilegalstateexception-can-not-perform-this-action-after-onsa) – pRaNaY

Odpowiedz

8

Wreszcie znalazł rozwiązanie, nie można zamienić ani zastąpić fragmentu w onActivityResult()

Musimy umieścić ten kod w Handler lub OnResume()

rozwiązanie:

private boolean change_fragment=false; 

OnActivityResult() Kod

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    change_fragment=true; 
} 

OnResume() kod

@Override 
public void onResume() { 
    super.onResume(); 
    if(change_fragment) 
    { 
     change_fragment=false; 
     Fragment fragment = new VirtualListFragment(); 
     FragmentManager fragmentManager = getFragmentManager(); 
     fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit(); 
    } 
} 
+2

Uwaga dla czytelników: nie powinieneś zatwierdzać transakcji fragmentu w onResume(). Użyj metody onResumeFragments() (dla FragmentActivity) lub onPostResume() (dla działania), która pozwoli uniknąć problemu "java.lang.IllegalStateException: Nie można wykonać tej akcji po stanie OnSaveInstanceState". Kredyty na http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html – vanomart

+0

nic nie działa w moim przypadku ani handler, ani onresume :-( –

0

Have ty próbowałeś tego? Miej nadzieję, że ten pomaga

Musisz uzyskać fragment manager z Twojej aktywności głównej.

Spróbuj poniżej fragmencie: -

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if(requestCode == 1){ 
     if(resultCode == Activity.RESULT_OK){ 
      android.support.v4.app.FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); 
      android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      fragmentTransaction.replace(R.id.container, new DemoFragment(), "fsdf").commit(); 
     } 
    } 
} 
1

Odpowiedź na to pytanie jest to, że nie powinno się nazywać popełnić na transakcji fragmentu przed działalnością ładunku to savedInstanceState lub po oszczędza to savedInstanceState.

Jedna z istniejących odpowiedzi na to pytanie wspomina o działaniu # onResume() jako miejscu do zatwierdzenia transakcji fragmentu, jednak właściwość # OnPostResume() byłaby lepszym rozwiązaniem, ponieważ jest wywoływana, gdy gwarantowany jest stan instancji działania do przywrócenia.

dobre wyjaśnienie tego, co się dzieje i dlaczego tak się dzieje jest w tym poście: http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

Powiązane problemy