Na minha atividade, estou chamando uma segunda atividade da atividade principal por startActivityForResult
. Na minha segunda atividade, existem alguns métodos que finalizam essa atividade (talvez sem resultado), no entanto, apenas um deles retorna um resultado.
Por exemplo, da atividade principal, chamo de segunda. Nesta atividade, estou verificando alguns recursos do aparelho, como se ele tivesse uma câmera. Se não tiver, fecharei esta atividade. Além disso, durante a preparação MediaRecorder
ou MediaPlayer
se ocorrer um problema, fecharei esta atividade.
Se o dispositivo tiver uma câmera e a gravação for concluída completamente, depois de gravar um vídeo, se um usuário clicar no botão Concluído, enviarei o resultado (endereço do vídeo gravado) de volta à atividade principal.
Como verifico o resultado da atividade principal?
Respostas:
Na sua
FirstActivity
chamada, oSecondActivity
usostartActivityForResult()
métodoPor exemplo:
No seu
SecondActivity
conjunto, os dados aos quais você deseja retornarFirstActivity
. Se você não quiser voltar, não defina nenhum.Por exemplo: In,
SecondActivity
se você deseja enviar dados de volta:Se você não deseja retornar dados:
Agora em sua
FirstActivity
classe, escreva o código a seguir para oonActivityResult()
métodoPara implementar a transmissão de dados entre duas atividades de uma maneira muito melhor no Kotlin, acesse este link ' Uma maneira melhor de transmitir dados entre as atividades '
fonte
SecondActivity
alguma exceção ocorrida, nesse caso também seja necessário retornar o resultado paraFirstActivity
, para que você possa defini-lo como"RESULT_CANCELLED"
no bloco catch e retornar paraFirstActivty
e paraFirstActivity's' 'onActivityResult()
verificar se obteve o resultado do êxito ou falha.Você precisa substituir
Activity.onActivityResult()
e verificar seus parâmetros:requestCode
identifica qual aplicativo retornou esses resultados. Isso é definido por você quando você ligastartActivityForResult()
.resultCode
informa se este aplicativo foi bem-sucedido, falhou ou algo diferentedata
mantém todas as informações retornadas por este aplicativo. Isso pode sernull
.fonte
Complementando a resposta de @ Nishant, a melhor maneira de retornar o resultado da atividade é:
Eu estava tendo problemas com
Então eu descobri que a maneira correta está usando
para obter a intenção atual
fonte
Intent
que exista apenas para conter umBundle
e não tenha os valores normais, como uma ação ou componente. Mas também parece um pouco estranho (e potencialmente perigoso?) Modificar oIntent
que foi usado para iniciar a atividade atual. Então, procurei na fonte o próprio Android e descobri que eles sempre criam um novoIntent
para usar como resultado. Por exemplo, github.com/aosp-mirror/platform_frameworks_base/blob/…getIntent()
parece ser uma maneira perfeita de retornar dados para atividades desconhecidas, de onde a atividade foi chamada. Obrigado!Exemplo
Para ver todo o processo em contexto, aqui está uma resposta suplementar. Veja minha resposta completa para mais explicações.
MainActivity.java
SecondActivity.java
fonte
Para aqueles que têm problemas com requestCode incorreto onActivityResult
Se você está chamando
startActivityForResult()
de seuFragment
, o requestCode é alterado pela atividade que possui o fragmento.Se você deseja obter o resultado correto na sua atividade, tente o seguinte:
Mudança:
startActivityForResult(intent, 1);
Para:getActivity().startActivityForResult(intent, 1);
fonte
Se você deseja atualizar a interface do usuário com o resultado da atividade, não é possível usar
this.runOnUiThread(new Runnable() {}
Fazendo isso, a interface do usuário não será atualizada com novo valor. Em vez disso, você pode fazer isso:Isso parece bobagem, mas funciona muito bem.
fonte
Primeiro você usa os
startActivityForResult()
parâmetros primeiroActivity
e, se deseja enviar dados do segundoActivity
ao primeiroActivity
, passe o valor usandoIntent
withsetResult()
method e obtenha esses dados dentro doonActivityResult()
método primeiroActivity
.fonte
Problema muito comum no android
Ele pode ser dividido em 3 partes
1) iniciar a atividade B (acontece na atividade A)
2) definir dados solicitados (acontece na atividade B)
3) receber dados solicitados (acontece na atividade A)
Nesta parte, você decide se deseja enviar dados de volta ou não quando ocorrer um evento específico.
Ex .: Na atividade B há um EditText e dois botões b1, b2.
Clicar no botão b1 envia os dados de volta à atividade A
Clicar no botão b2 não envia nenhum dado.
Enviando dados
Não está enviando dados
usuário clica no botão Voltar
Por padrão, o resultado é definido com o código de resposta Activity.RESULT_CANCEL
Para essa substituição do método onActivityResult
fonte
O ActivityResultRegistry é a abordagem recomendada
ComponentActivity
agora oferece umaActivityResultRegistry
que lhe permite lidar com ostartActivityForResult()
+onActivityResult()
, bem comorequestPermissions()
+onRequestPermissionsResult()
flui sem substituir métodos em suaActivity
ouFragment
, traz maior segurança Tipo de viaActivityResultContract
, e fornece ganchos para testar esses fluxos.É altamente recomendável usar as APIs de resultado da atividade introduzidas na atividade AndroidX 1.2.0-alpha02 e no fragmento 1.3.0-alpha02.
Adicione isto ao seu
build.gradle
Como usar o contrato pré-construído?
Essa nova API possui as seguintes funcionalidades pré-criadas
Um exemplo que usa o contrato takePicture:
Então, o que está acontecendo aqui? Vamos dividir um pouco.
takePicture
é apenas um retorno de chamada que retorna um bitmap anulável - se é nulo ou não, depende se oonActivityResult
processo foi ou não bem-sucedido.prepareCall
depois registra essa chamada em um novo recursoComponentActivity
chamadoActivityResultRegistry
- voltaremos a isso mais tarde.ActivityResultContracts.TakePicture()
é um dos ajudantes internos que o Google criou para nós e, finalmente, a chamadatakePicture
realmente aciona a intenção da mesma maneira que você faria anteriormenteActivity.startActivityForResult(intent, REQUEST_CODE)
.Como escrever um contrato personalizado?
Contrato simples que pega um Int como uma Entrada e retorna uma String que solicitou a Atividade retorna no resultado Intent.
Verifique esta documentação oficial para mais informações.
fonte
fonte