En mi actividad, llamo a una segunda actividad de la actividad principal por startActivityForResult
. En mi segunda actividad, hay algunos métodos que terminan esta actividad (tal vez sin un resultado), sin embargo, solo uno de ellos devuelve un resultado.
Por ejemplo, desde la actividad principal, llamo una segunda. En esta actividad, verifico algunas características del teléfono, como si tiene una cámara. Si no es así, cerraré esta actividad. Además, durante la preparación MediaRecorder
o MediaPlayer
si ocurre un problema, cerraré esta actividad.
Si su dispositivo tiene una cámara y la grabación se realiza por completo, luego de grabar un video si un usuario hace clic en el botón Listo, enviaré el resultado (dirección del video grabado) a la actividad principal.
¿Cómo verifico el resultado de la actividad principal?
Respuestas:
Desde su
FirstActivity
llamada, el método deSecondActivity
usostartActivityForResult()
Por ejemplo:
En su
SecondActivity
conjunto, los datos a los que desea volverFirstActivity
. Si no desea regresar, no configure ninguno.Por ejemplo: en
SecondActivity
si desea devolver datos:Si no desea devolver datos:
Ahora en su
FirstActivity
clase escriba el siguiente código para elonActivityResult()
método.Para implementar el paso de datos entre dos actividades de una manera mucho mejor en Kotlin, vaya a este enlace ' Una mejor manera de pasar datos entre actividades '
fuente
SecondActivity
, en el caso de que ocurriera alguna excepción, en ese caso también debe devolver el resultado alFirstActivity
, para que pueda establecer el resultado como"RESULT_CANCELLED"
en el bloque catch y volverFirstActivty
y en elFirstActivity's' 'onActivityResult()
que puede verificar si obtuvo el resultado de éxito o fracaso.Debe anular y
Activity.onActivityResult()
luego verificar sus parámetros:requestCode
identifica qué aplicación devolvió estos resultados. Esto lo define usted cuando llamastartActivityForResult()
.resultCode
le informa si esta aplicación tuvo éxito, falló o algo diferentedata
contiene cualquier información devuelta por esta aplicación. Esto puede sernull
.fuente
Complementando la respuesta de @ Nishant, la mejor manera de devolver el resultado de la actividad es:
Estaba teniendo problemas con
Luego descubrí que la forma correcta es usar
para obtener la intención actual
fuente
Intent
que solo existe para contenerBundle
ay no tiene los valores normales como una acción o componente. Pero también se siente un poco extraño (¿y potencialmente peligroso?) Modificar loIntent
que se usó para iniciar la actividad actual. Así que busqué en la fuente el propio Android y descubrí que siempre crean uno nuevoIntent
para usar como resultado. Por ejemplo, github.com/aosp-mirror/platform_frameworks_base/blob/…getIntent()
parece ser una manera perfecta de devolver datos a una actividad desconocida, desde donde se ha llamado la actividad. ¡Gracias!Ejemplo
Para ver todo el proceso en contexto, aquí hay una respuesta complementaria. Vea mi respuesta más completa para más explicaciones.
MainActivity.java
SecondActivity.java
fuente
Para aquellos que tienen problemas con requestCode incorrecto en onActivityResult
Si llama
startActivityForResult()
desde suFragment
, la Actividad que posee el Fragmento cambia el código de solicitud.Si desea obtener el código de resultado correcto en su actividad, intente esto:
Cambio:
startActivityForResult(intent, 1);
A:getActivity().startActivityForResult(intent, 1);
fuente
Si desea actualizar la interfaz de usuario con el resultado de la actividad, no puede usar
this.runOnUiThread(new Runnable() {}
Al hacer esto, la IU no se actualizará con un nuevo valor. En cambio, puedes hacer esto:Esto parece una tontería pero funciona bastante bien.
fuente
En primer lugar se utiliza
startActivityForResult()
con los parámetros en primeraActivity
y si desea enviar datos desde la segundaActivity
a la primeraActivity
y luego pasa valor utilizandoIntent
consetResult()
método y obtener que los datos dentro deonActivityResult()
método en el primeroActivity
.fuente
Problema muy común en Android
Se puede dividir en 3 Piezas
1) iniciar la Actividad B (sucede en la actividad A)
2) Establecer los datos solicitados (sucede en la actividad B)
3) Recibir los datos solicitados (sucede en la actividad A)
En esta parte, usted decide si desea devolver los datos o no cuando ocurre un evento en particular.
Por ejemplo: en la actividad B hay un EditText y dos botones b1, b2.
Al hacer clic en el Botón b1, los datos vuelven a la actividad A
Al hacer clic en el Botón b2 no se envían datos.
Enviando datos
No enviando datos
el usuario hace clic en el botón Atrás
De manera predeterminada, el resultado se establece con el código de respuesta Activity.RESULT_CANCEL
Para eso anular el método onActivityResult
fuente
ActivityResultRegistry es el enfoque recomendado
ComponentActivity
Ahora proporciona unaActivityResultRegistry
que le permite manejar elstartActivityForResult()
+onActivityResult()
, así comorequestPermissions()
+onRequestPermissionsResult()
fluye sin anulando métodos en suActivity
oFragment
, aporta una mayor seguridad a través de tipoActivityResultContract
, y proporciona enlaces para probar estos flujos.Se recomienda encarecidamente utilizar las API de resultados de actividad introducidas en AndroidX Activity 1.2.0-alpha02 y Fragment 1.3.0-alpha02.
Agregue esto a su
build.gradle
¿Cómo usar el contrato preconstruido?
Esta nueva API tiene las siguientes funcionalidades preconstruidas
Un ejemplo que utiliza takePicture contract:
Entonces, ¿qué está pasando aquí? Vamos a desglosarlo un poco.
takePicture
es solo una devolución de llamada que devuelve un mapa de bits anulable: si es nulo o no depende de si elonActivityResult
proceso fue exitoso o no .prepareCall
luego registra esta llamada en una nueva funciónComponentActivity
llamadaActivityResultRegistry
- volveremos a esto más adelante.ActivityResultContracts.TakePicture()
es uno de los ayudantes integrados que Google ha creado para nosotros, y finalmente invocandotakePicture
realidad activa la intención de la misma manera que lo haría anteriormenteActivity.startActivityForResult(intent, REQUEST_CODE)
.¿Cómo escribir un contrato personalizado?
Contrato simple que toma un Int como Entrada y devuelve una Cadena que la Actividad solicitada devuelve en la Intención del resultado.
Consulte esta documentación oficial para más información.
fuente
fuente