Eu tenho duas atividades: atividade principal e atividade infantil.
Quando pressiono um botão na atividade principal, a atividade infantil é iniciada.
Agora, quero enviar alguns dados de volta para a tela principal. Eu usei a classe Bundle, mas não está funcionando. Ele lança algumas exceções de tempo de execução.
Existe alguma solução para isso?
android
android-intent
Rajapandian
fonte
fonte
Respostas:
Existem algumas maneiras de conseguir o que você deseja, dependendo das circunstâncias.
O cenário mais comum (que é o seu som) é quando uma Atividade filho é usada para obter informações do usuário - como escolher um contato de uma lista ou inserir dados em uma caixa de diálogo. Nesse caso, você deve usar
startActivityForResult
para iniciar o seu filho Activity.Isso fornece um pipeline para enviar dados de volta para a Atividade principal usando
setResult
. O método setResult usa um valor de resultado int e um Intent que são passados de volta para a atividade de chamada.Para acessar os dados retornados na substituição de atividade de chamada
onActivityResult
. O requestCode corresponde ao número inteiro passado nastartActivityForResult
chamada, enquanto o resultCode e os dados Intent são retornados da atividade filho.fonte
startActivityForResult
função em vez de apenasstartActivity
. Um exemplo pode serstartActivityForResult(myIntent, 2);
onde 2 é o código do resultado, que pode substituir aMY_CHILD_ACTIVITY
instrução switch acima.A atividade 1 usa startActivityForResult :
A Atividade 2 é iniciada e você pode executar a operação. Para fechar a Atividade, faça o seguinte:
Atividade 1 - ao retornar da atividade anterior, chamaráActivityResult :
ATUALIZAÇÃO: resposta ao comentário de Seenu69, na atividade dois,
Então, na atividade um,
fonte
Enviando Dados Voltar
Isso me ajuda a ver as coisas em contexto. Aqui está um projeto simples e completo para enviar dados de volta. Em vez de fornecer os arquivos de layout xml, aqui está uma imagem.
Atividade principal
startActivityForResult
, fornecendo um código de resultado arbitrário.onActivityResult
. Isso é chamado quando a Segunda Atividade termina. Você pode ter certeza de que é realmente a segunda atividade, verificando o código de solicitação. (Isso é útil quando você está iniciando várias atividades diferentes da mesma atividade principal.)Intent
. Os dados são extraídos usando um par de valores-chave.MainActivity.java
Segunda atividade
Intent
. Os dados são armazenados noIntent
par usando valor-chave.RESULT_OK
e adicione a intenção que contém seus dados.finish()
para fechar a segunda atividade.SecondActivity.java
Outras notas
RESULT_OK
. Basta usar o nome completo:Activity.RESULT_OK
.Veja também
fonte
FirstActivity usa startActivityForResult:
Na chamada SecondActivity, setResult () eventos onClick ou onBackPressed ()
fonte
Chame a atividade filho Intent usando a chamada do método startActivityForResult ()
Há um exemplo disso aqui: http://developer.android.com/training/notepad/notepad-ex2.html
e em "Retornando um resultado de uma tela": http://developer.android.com/guide/faq/commontasks.html#opennewscreen
fonte
Eu criei uma classe de demonstração simples para sua melhor referência.
fonte
Na primeira atividade, você pode enviar a intenção de usar
startActivityForResult()
e, em seguida, obter resultados da segunda atividade depois que ela terminar de usarsetResult
.MainActivity.class
SecondActivity.class
fonte
Todas essas respostas estão explicando que o cenário da sua segunda atividade precisa ser concluído após o envio dos dados.
Mas, se você não deseja concluir a segunda atividade e deseja enviar os dados novamente para a primeira, use o BroadCastReceiver.
Na segunda atividade -
Na primeira atividade
Registre o receptor em onCreate () -
Cancelar o registro em onDestroy ()
fonte
Outra maneira de alcançar o resultado desejado, que pode ser melhor, dependendo da sua situação, é criar uma interface de ouvinte.
Ao fazer com que a atividade pai escute uma interface que é acionada pela atividade filho ao passar os dados necessários como parâmetro, pode criar um conjunto semelhante de circunstâncias
fonte
Existem algumas maneiras de fazer isso. 1. usando o startActivityForResult (), que é muito bem explicado nas respostas acima.
criando as variáveis estáticas na sua classe "Utils" ou em qualquer outra classe de sua preferência. Por exemplo, eu quero passar studentId de ActivityB para ActivityA.Primeiro meu ActivityA está chamando o ActivityB. Em seguida, dentro da ActivityB, defina o studentId (que é um campo estático no Utils.class). Como este Utils.STUDENT_ID = "1234"; depois, ao voltar para a ActivityA, use o studentId que está armazenado em Utils.STUDENT_ID.
criando um método getter e setter na sua classe Application.
como isso:
então você está pronto. basta definir os dados quando você estiver no ActivityB e, depois de retornar ao ActivityA, obtenha os dados.
fonte
Apenas um pequeno detalhe que acho que está faltando nas respostas acima.
Se a sua atividade filho puder ser aberta a partir de várias atividades principais, você poderá verificar se precisa
setResult
ou não, com base em se a sua atividade foi aberta porstartActivity
oustartActivityForResult
. Você pode conseguir isso usandogetCallingActivity()
. Mais informações aqui .fonte
Use sharedPreferences, salve seus dados e acesse-os de qualquer lugar do aplicativo
salvar data como esta
E receba dados como este
fonte