with - web android studio




setResult non funziona quando il pulsante BACK è premuto (7)

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?


Dovresti eseguire l'override di onOptionsItemSelected in questo modo:

@Override
public boolean onOptionsItemSelected(final MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        final Intent mIntent = new Intent();
        mIntent.putExtra("param", "value");
        setResult(RESULT_OK, mIntent);
        finish();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

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 .


Incollo la risposta potrebbe essere utile ad altre persone: quando un insieme launcheMode con Android: launchMode = "singleTask" non riesco nemmeno a ottenere il risultato, il documento dice:

     /* <p>Note that this method should only be used with Intent protocols
 * that are defined to return a result.  In other protocols (such as
 * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
 * not get the result when you expect.  For example, if the activity you
 * are launching uses the singleTask launch mode, it will not run in your
 * task and thus you will immediately receive a cancel result.
 */

e:

     /* <p>As a special case, if you call startActivityForResult() with a requestCode 
 * >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
 * activity, then your window will not be displayed until a result is 
 * returned back from the started activity.  This is to avoid visible 
 * flickering when redirecting to another activity. 
 */

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.


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();
    }

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





android