Android: come fare in modo che un'attività restituisca risultati all'attività che la chiama?


128

Ho Locationun'attività che può essere chiamata da molte attività, come Sign upe Order. Nell'attività l' Locationutente inserisce la sua posizione, quindi l'attività Locationrestituirà questa nuova posizione a quell'attività che l'ha chiamata.

Quindi quando l' Sign upattività chiama l' Locationattività, deve restituire i dati Sign upall'attività. Un'altra volta l' Orderattività farà la stessa cosa.

Nota

So che mi dirai che dovrei pubblicare il codice, ma non ti sto chiedendo di darmi il codice; Voglio solo alcuni consigli, link o buoni thread.


puoi usare finish () call to back ..
Harshid

1

@Harshid mi darebbe maggiori dettagli per favore, o se si dispone di collegamenti che sarebbero apprezzati
utente utente

Risposte:


253

Per iniziare un'attività che dovrebbe restituire il risultato all'attività chiamante, dovresti fare qualcosa di simile di seguito. Dovresti passare il codice richiesta come mostrato di seguito per identificare che hai ottenuto il risultato dall'attività che hai iniziato.

startActivityForResult(new Intent(“YourFullyQualifiedClassName”),requestCode);

Nell'attività è possibile utilizzare setData()per restituire il risultato.

Intent data = new Intent();
String text = "Result to be returned...."
//---set the data to pass back---
data.setData(Uri.parse(text));
setResult(RESULT_OK, data);
//---close the activity---
finish();

Quindi di nuovo nella prima attività scrivi il codice seguente in onActivityResult ()

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == request_Code) {
        if (resultCode == RESULT_OK) {
            String returnedResult = data.getData().toString();
            // OR
            // String returnedResult = data.getDataString();
        }
    }
}

MODIFICA in base al tuo commento: se vuoi restituire tre stringhe, segui questa operazione facendo uso delle coppie chiave / valore con l'intento invece di usare Uri.

Intent data = new Intent();
data.putExtra("streetkey","streetname");
data.putExtra("citykey","cityname");
data.putExtra("homekey","homename");
setResult(RESULT_OK,data);
finish();

Ricevili su onActivityResult come di seguito:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == request_Code) {
        if (resultCode == RESULT_OK) {
            String street = data.getStringExtra("streetkey");
            String city = data.getStringExtra("citykey");
            String home = data.getStringExtra("homekey");
        }
    }
}

cosa hai detto non capisco il tuo ultimo commento, mi dispiace non sono un buon inglese, sto provando il tuo codice ora, che cosa requestcodeposso inserire un numero intero?
utente utente

1
Ho detto, No Problems (NP) e, come hai detto, potresti essere in ritardo nell'attuazione di questo, ho risposto che per prenderti il ​​tuo tempo e poi commentarlo in modo da poter essere avvisato. Venendo a requestcode, sì, puoi dare un valore intero come int requestCode = 1;
Kanth,

sì, funziona bene, accetto la tua risposta, grazie mille, voglio chiederti se c'è un modo quindi non solo inviare una stringa, voglio inviare 3 stringhe, come "città", "strada", " home ", c'è un modo per etichettare le stringhe?
utente utente

la tua risposta è eccellente, se vuoi, modifica il titolo in modo che molti utenti possano cercarlo
utente

Stavo cercando come creare l'intento : new Intent(this, OtherActivity.class);posso usare questo codice in un'attività.
Utente

3

Se vuoi finire e aggiungere un resultCode(senza dati), puoi chiamare setResult(int resultCode)prima finish().

Per esempio:

...
if (everything_OK) {
    setResult(Activity.RESULT_OK); // OK! (use whatever code you want)
    finish();
}
else {
   setResult(Activity.RESULT_CANCELED); // some error ...
   finish();
}
...

Quindi nella tua attività di chiamata, controlla resultCode, per vedere se stiamo bene.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == someCustomRequestCode) {
        if (resultCode == Activity.RESULT_OK) {
            // OK!
        }
        else if (resultCode = Activity.RESULT_CANCELED) {
            // something went wrong :-(
        }
    }
}

Non dimenticare di chiamare l'attività con startActivityForResult(intent, someCustomRequestCode).


4
il valore di Activity.RESULT_OKè in realtà -1, nel caso che confonda qualcuno. Vorrei solo suggerire di utilizzare le Activitycostanti
jacoballenwood,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.