Tengo dos actividades: actividad principal y actividad infantil.
Cuando presiono un botón en la actividad principal, se inicia la actividad secundaria.
Ahora quiero enviar algunos datos a la pantalla principal. Usé la clase Bundle, pero no funciona. Lanza algunas excepciones de tiempo de ejecución.
¿Hay alguna solución para esto?
android
android-intent
Rajapandian
fuente
fuente
Respuestas:
Hay un par de formas de lograr lo que desea, según las circunstancias.
El escenario más común (que es como suena el suyo) es cuando se utiliza una Actividad secundaria para obtener la entrada del usuario, como elegir un contacto de una lista o ingresar datos en un cuadro de diálogo. En este caso, debe utilizar
startActivityForResult
para iniciar su actividad infantil.Esto proporciona una canalización para enviar datos de vuelta a la Actividad principal usando
setResult
. El método setResult toma un valor de resultado int y un Intent que se devuelve a la Actividad de llamada.Para acceder a los datos devueltos en la anulación de la Actividad que realiza la llamada
onActivityResult
. RequestCode corresponde al número entero pasado en lastartActivityForResult
llamada, mientras que resultCode y data Intent se devuelven de la actividad secundaria.fuente
startActivityForResult
función en lugar de solostartActivity
. Un ejemplo podría serstartActivityForResult(myIntent, 2);
donde 2 es el código de resultado, que puede ocupar el lugarMY_CHILD_ACTIVITY
en la declaración de cambio anterior.La Actividad 1 usa startActivityForResult :
La Actividad 2 se inicia y puede realizar la operación, para cerrar la Actividad haga esto:
Actividad 1: al regresar de la actividad anterior, se llamará aActivityResult :
ACTUALIZACIÓN: respuesta al comentario de Seenu69, en la actividad dos,
Luego, en la actividad uno,
fuente
Enviar datos de vuelta
Me ayuda a ver las cosas en contexto. Aquí hay un proyecto simple y completo para enviar datos de vuelta. En lugar de proporcionar los archivos de diseño xml, aquí hay una imagen.
Actividad principal
startActivityForResult
, proporcionándole un código de resultado arbitrario.onActivityResult
. Esto se llama cuando termina la segunda actividad. Puede asegurarse de que realmente sea la segunda actividad al verificar el código de solicitud. (Esto es útil cuando está iniciando múltiples actividades diferentes desde la misma actividad principal).Intent
. Los datos se extraen utilizando un par clave-valor.MainActivity.java
Segunda actividad
Intent
. Los datos se almacenanIntent
utilizando un par clave-valor.RESULT_OK
y agregue la intención que contiene sus datos.finish()
para cerrar la segunda actividad.SecondActivity.java
Otras notas
RESULT_OK
. Sólo tiene que utilizar el nombre completo:Activity.RESULT_OK
.Ver también
fuente
FirstActivity usa startActivityForResult:
En SecondActivity llame a setResult () onClick events o onBackPressed ()
fuente
Llame a la actividad secundaria Intención utilizando la llamada al método startActivityForResult ()
Hay un ejemplo de esto aquí: http://developer.android.com/training/notepad/notepad-ex2.html
y en "Devolver un resultado de una pantalla" de esto: http://developer.android.com/guide/faq/commontasks.html#opennewscreen
fuente
He creado una clase de demostración simple para su mejor referencia.
fuente
En la primera actividad, puede enviar la intención usando
startActivityForResult()
y luego obtener el resultado de la segunda actividad después de que termine de usarsetResult
.MainActivity.class
SecondActivity.class
fuente
Todas estas respuestas explican que el escenario de su segunda actividad debe finalizar después de enviar los datos.
Pero en caso de que no desee finalizar la segunda actividad y enviar los datos nuevamente al primero, para eso puede usar BroadCastReceiver.
En segunda actividad
En primera actividad
Registre el receptor en onCreate () -
Anular el registro en onDestroy ()
fuente
Otra forma de lograr el resultado deseado que puede ser mejor dependiendo de su situación es crear una interfaz de escucha.
Al hacer que la actividad principal escuche una interfaz que se activa por la actividad secundaria mientras pasa los datos requeridos como parámetro, puede crear un conjunto similar de circunstancias
fuente
Hay algunas formas de hacer esto. 1. utilizando startActivityForResult (), que se explica muy bien en las respuestas anteriores.
creando las variables estáticas en su clase "Utils" o en cualquier otra clase propia. Por ejemplo, quiero pasar studentId de ActivityB a ActivityA. Primero, mi ActivityA está llamando a ActivityB. Luego, dentro de ActivityB, configure el studentId (que es un campo estático en Utils.class). Me gusta esto. Utilidades. luego, mientras regresa a la Actividad A, use el studentId que está almacenado en Utils.STUDENT_ID.
creando un método getter y setter en su clase de aplicación.
Me gusta esto:
entonces ya terminaste. simplemente configure los datos dentro cuando esté en ActivityB y luego de regresar a ActivityA, obtenga los datos.
fuente
Solo un pequeño detalle que creo que falta en las respuestas anteriores.
Si la actividad de su hijo se puede abrir desde múltiples actividades para padres, entonces puede verificar si necesita hacerlo
setResult
o no, en función de si su actividad fue abierta porstartActivity
ostartActivityForResult
. Puede lograr esto usandogetCallingActivity()
. Más información aquí .fuente
Use sharedPreferences y guarde sus datos y acceda a ellos desde cualquier lugar de la aplicación
guardar fecha como esta
Y recibir datos como este
fuente