android lifecycle - "Risultato di consegna non riuscito"-onActivityForResult





fragments how (5)


È possibile utilizzare ft.commitAllowingStateLoss() per risolvere questo problema.

Motivo: il tuo metodo ft.commit() è stato attivato dopo onSaveInstanceState .

Ho un LoginActivity (utente LoginActivity ). Fondamentalmente è la sua Activity tema come una finestra di dialogo (per apparire come una finestra di dialogo). Appare su SherlockFragmentActivity . Quello che voglio è: se c'è un login di successo, ci dovrebbero essere due FragmentTransaction per aggiornare la vista. Ecco il codice:

In LoginActivity , se l'accesso è riuscito,

setResult(1, new Intent());

In SherlockFragmentActivity :

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

    if (resultCode == 1) {
        LoggedStatus = PrefActivity.getUserLoggedInStatus(this);
        FragmentTransaction t = MainFragmentActivity.this.getSupportFragmentManager().beginTransaction();
        SherlockListFragment mFrag = new MasterFragment();
        t.replace(R.id.menu_frame, mFrag);
        t.commit();

        // Set up Main Screen
        FragmentTransaction t2 = MainFragmentActivity.this.getSupportFragmentManager().beginTransaction();
        SherlockListFragment mainFrag = new FeaturedFragment();
        t2.replace(R.id.main_frag, mainFrag);
        t2.commit();
    }
}

Si blocca sul primo commit, con questo LogCat:

E/AndroidRuntime(32072): Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
E/AndroidRuntime(32072):    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299)
E/AndroidRuntime(32072):    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310)
E/AndroidRuntime(32072):    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
E/AndroidRuntime(32072):    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)
E/AndroidRuntime(32072):    at com.kickinglettuce.rate_this.MainFragmentActivity.onActivityResult(MainFragmentActivity.java:243)
E/AndroidRuntime(32072):    at android.app.Activity.dispatchActivityResult(Activity.java:5293)
E/AndroidRuntime(32072):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3315)



Prima di tutto, dovresti leggere il mio post sul blog per ulteriori informazioni (parla del perché questa eccezione si verifica e cosa puoi fare per impedirlo).

Chiamare commitAllowingStateLoss() è più di un hack che una correzione. La perdita di stato è cattiva e dovrebbe essere evitata a tutti i costi. Nel momento in cui viene chiamato onActivityResult() , lo stato di attività / frammento potrebbe non essere stato ancora ripristinato e, di conseguenza, tutte le transazioni che si verificano durante questo periodo andranno perse. Questo è un bug molto importante che deve essere affrontato! (Nota che il bug si verifica solo quando la tua Activity sta tornando dopo essere stata uccisa dal sistema ... il che, a seconda di quanta memoria ha il dispositivo, a volte può essere raro ... quindi questo tipo di bug non è qualcosa che è molto facile da catturare durante il test).

Prova a spostare le tue transazioni su onPostResume() invece (nota che onPostResume() viene sempre chiamato dopo onResume() e onResume() viene sempre chiamato dopo onActivityResult() ):

private boolean mReturningWithResult = false;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    mReturningWithResult = true;
}

@Override
protected void onPostResume() {
    super.onPostResume();
    if (mReturningWithResult) {
        // Commit your transactions here.
    }
    // Reset the boolean flag back to false for next time.
    mReturningWithResult = false;
}

Questo potrebbe sembrare un po 'strano, ma fare questo genere di cose è necessario per garantire che i tuoi FragmentTransaction siano sempre impegnati dopo che lo stato onPostResume() è stato ripristinato allo stato originale ( onPostResume() è garantito per essere chiamato dopo l' Activity ' stato s è stato ripristinato).




Nel mio caso ho affrontato gli stessi problemi a causa del seguito

public void onBackPressed() {
    super.onBackPressed();
    setIntents();

}


private void setIntents(){
    Intent searchConstaints=new Intent();
    searchConstaints.putExtra("min",20);
    searchConstaints.putExtra("max",80);
    setResult(101,searchConstaints);
    finish();
}

Risolto riordinando la funzione Chiamate entro onBackPressed ()

public void onBackPressed() {

    setIntents();
    super.onBackPressed();

}



il tuo logcat dice chiaramente: "Impossibile eseguire questa azione dopo onSaveInstanceState" : la tua Activity è già morta a quel punto e non è stato possibile restituire alcun risultato.

levati:

Intent in = new Intent();
setResult(1, in);

al posto nella tua Activity cui è ancora vivo, e tutto andrà bene. e non dimenticare di finish() tua Activity per consegnare il risultato.




Ho avuto lo stesso problema. Mi sono appena sbarazzato dell'uso,

mDrawerLayout.closeDrawer(Gravity.LEFT);




android android-intent android-activity android-fragmentactivity