2015-12-29 12 views
5

sto cercando di sostituire fragment in onActivityResult() ma mi dà sempre l'errore di java.lang.illegalStateException.onActivityResult() Errore di transazione frammento

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) 

Ecco il mio codice 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

provare transaction.commitAllowingStateLoss(); –

+0

L'ho provato, non sostituisce il frammento, ma mostra il frammento vuoto in quel punto –

+0

puoi controllare [questo] (http://stackoverflow.com/questions/14177781/java-lang-illegalstateexception-can-not-perform -questo-azione-dopo-onsaveinstanc), [questo] (http://stackoverflow.com/questions/7575921/illegalstateexception-can-not-perform-this-action-after-onsaveinstancestate-wit), [this] (http : //stackoverflow.com/questions/7469082/getting-exception-illegalstateexception-can-not-perform-this-action-after-onsa) – pRaNaY

risposta

8

finalmente trovato la soluzione, frammento non può essere scambiato o sostituito in onActivityResult()

abbiamo bisogno di mettere questo codice in Handler o in OnResume()

Soluzione:

private boolean change_fragment=false; 

onActivityResult() Codice

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

    change_fragment=true; 
} 

onResume() Codice

@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

Nota per i lettori: non si devono impegnare le transazioni frammento in onResume(). Utilizzare il metodo onResumeFragments() (per FragmentActivity) o onPostResume() (per Attività) che eviterà il problema "java.lang.IllegalStateException: Impossibile eseguire questa azione dopo onSaveInstanceState". Crediti per http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html – vanomart

+0

niente sta funzionando nel mio caso né gestore o onresume :-( –

0

Hanno tu provato questo? spero che questo aiuti

Hai bisogno di ottenere un fragment manager dal tuo principale attività.

Prova sotto frammento: -

@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

La risposta a questa domanda è che non si dovrebbe chiamare il commit su una transazione frammento prima di un carico di attività è savedInstanceState o dopo lo salva è savedInstanceState.

Una delle risposte esistenti per questa domanda menziona Activity # onResume() come posizione per il commit della transazione del frammento, tuttavia Activity # onPostResume() sarebbe un'opzione migliore poiché viene chiamata quando lo stato dell'istanza dell'attività è garantito da restaurare.

Una buona spiegazione di quanto sta accadendo e perché succede è fornito in questo post del blog: http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

Problemi correlati