Android: como fazer uma atividade retornar resultados à atividade que a chama?

128

Eu tenho uma Locationatividade que pode ser chamada de várias atividades, como Sign upe Order. Na Locationatividade, o usuário digita sua localização, para que a atividade Locationretorne esse novo local à atividade que o chamou.

Portanto, quando a Sign upatividade chama a Locationatividade, ela deve retornar os dados para a Sign upatividade. Outra vez a Orderatividade fará a mesma coisa.

Nota

Sei que você vai me dizer que devo postar o código, mas não estou pedindo que você me dê o código; Eu só quero algumas dicas, links ou bons tópicos.

usuário usuário
fonte
você pode utilizar acabamento () chamada para trás ..
Harshid
1
Será que você verifique startActivityForResult developer.android.com/reference/android/app/Activity.html
vinaykumar
@Harshid, você poderia me dar mais detalhes, por favor, ou se você tiver links que seriam apreciados
User user

Respostas:

253

Para iniciar uma atividade que deve retornar o resultado à atividade de chamada, você deve fazer algo como abaixo. Você deve passar o requestcode como mostrado abaixo para identificar que obteve o resultado da atividade que iniciou.

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

Na atividade, você pode usar setData()para retornar o resultado.

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

Então, novamente, na primeira atividade, você escreve o código abaixo em 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();
        }
    }
}

EDITAR com base no seu comentário: Se você deseja retornar três strings, siga isso usando pares de chave / valor com intenção em vez de usar Uri.

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

Obtenha-os no onActivityResult como abaixo:

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");
        }
    }
}
Kanth
fonte
o que você disse? não entendo seu último comentário, desculpe, eu não sou bom inglês, estou tentando seu código agora, o que é que requestcodeposso colocar qualquer número inteiro?
utilizador utilizador
1
Eu disse: Sem problemas (NP) e, como você disse que pode estar atrasado na implementação, eu respondi que, para tomar seu próprio tempo, e depois comento para que eu possa ser notificado. Chegando ao requestcode, sim, você pode fornecer um valor inteiro como int requestCode = 1;
Kanth
sim, está certo, eu aceito sua resposta, muito obrigado, quero lhe pedir se existe uma maneira de não apenas enviar string, quero enviar 3 strings, como "city", "street", " home ", existe uma maneira de rotular as strings?
usuário usuário
sua resposta é muito excelente, se você quiser, edite o título para que muitos usuários possam procurá-lo
usuário usuário
Eu estava procurando como criar a intenção : new Intent(this, OtherActivity.class);eu posso usar esse código em uma atividade.
Utilizador
3

Se você quiser terminar e adicionar um resultCode(sem dados), ligue setResult(int resultCode)antes finish().

Por exemplo:

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

Em sua atividade de chamada, verifique o resultCode, para ver se estamos bem.

@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 :-(
        }
    }
}

Não se esqueça de chamar a atividade com startActivityForResult(intent, someCustomRequestCode).

lenooh
fonte
4
o valor de Activity.RESULT_OKé realmente -1, caso isso confunda alguém. Gostaria apenas de sugerir usando as Activityconstantes
jacoballenwood