android menu - setResult non funziona quando il pulsante BACK è premuto




html activity (9)

Devi sovrascrivere il metodo onBackPressed () e impostare il risultato prima della chiamata alla superclasse, es

@Override
public void onBackPressed() {
    Bundle bundle = new Bundle();
    bundle.putString(FIELD_A, mA.getText().toString());

    Intent mIntent = new Intent();
    mIntent.putExtras(bundle);
    setResult(RESULT_OK, mIntent);
    super.onBackPressed();
}

Sto cercando di impostareRisultato dopo aver premuto il pulsante BACK. Chiaro suDestroy

Intent data = new Intent();
setResult(RESULT_OK, data) 

Ma quando si tratta di

onActivityResult(int requestCode, int resultCode, Intent data) 

il resultCode è 0 (RESULT_CANCELED) ei dati sono 'null'.

Quindi, come posso passare il risultato dell'attività interrotta dal pulsante BACK?


Activity risultato Activity deve essere impostato prima che venga chiamato finish() . Fare clic su BACK in realtà chiama finish() sulla tua activity , quindi puoi utilizzare il seguente snippet:

@Override
public void finish() {
    Intent data = new Intent();
    setResult(RESULT_OK, data); 

    super.finish();
}

Se chiami NavUtils.navigateUpFromSameTask(); in onOptionsItemSelected() , viene chiamato finish() , ma si otterrà il result code errato. Quindi devi chiamare finish() non navigateUpFromSameTask in onOptionsItemSelected() . errato requestCode in onActivityResult


onDestroy è troppo tardi nella catena - sostituisci invece onPause e controlla isFinishing() per verificare se la tua attività è alla fine del suo ciclo di vita.


Fare riferimento aActivityResult (int, int, Intent) doc

La soluzione è controllare il resultCode per il valore Activity.RESULT_CENCELED . Se sì, significa che è stato premuto BACK o l'attività si è interrotta. Spero che funzioni per voi ragazzi, lavora per me :).


Non fare affidamento su alcuna logica eseguita in onPause di un'attività quando si ritorna a quella iniziale. Secondo i documenti:

Le implementazioni di questo metodo (onPause) devono essere molto veloci perché l'attività successiva non verrà ripresa fino a quando questo metodo non ritorna

Vedi http://goo.gl/8S2Y per i dettagli.

Il modo più sicuro è impostare il risultato dopo che ogni operazione di modifica del risultato è stata completata (come indicato nella risposta)


Prova a eseguire l'override suBackPressed (da Android livello 5 in su), o sovrascrivi onKeyDown () e cattura KeyEvent.BUTTON_BACK (vedi Risultati attività Android ) Questo è il trucco per me.


Ho rifattorizzato il mio codice. Inizialmente ho preparato alcuni dati e l'ho impostato come activity result su onDestroy (questo non ha funzionato). Ora imposto i dati di activity ogni volta che i dati da restituire vengono aggiornati e non onDestroy nulla in onDestroy .


Se si desidera impostare RESULT_CODE personalizzato in evento onBackPressed , è necessario prima impostare il result e quindi chiamare super.onBackPressed() e si riceverà lo stesso RESULT_CODE nel metodo onActivityResult dell'attività del onActivityResult

    @Override
    public void onBackPressed()
    {
         setResult(SOME_INTEGER);
         super.onBackPressed();
    }

È possibile implementare un onActivityResult anche nella classe B e avviare la classe C utilizzando startActivityForResult. Una volta ottenuto il risultato in Classe B, impostare lì il risultato (per la Classe A) in base al risultato della Classe C. Non l'ho ancora provato, ma penso che dovrebbe funzionare.

Un'altra cosa da considerare è che l'attività A non dovrebbe essere un'attività singleInstance. Affinché startActivityForResult funzioni la classe B deve essere un'attività secondaria dell'attività A e ciò non è possibile in una singola attività di istanza, la nuova attività (classe B) inizia in una nuova attività.







android