Enviar datos a la actividad principal en Android
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. Utilicé la clase Bundle, pero no funciona. Lanza algunas excepciones de tiempo de ejecución.
¿Hay alguna solución para esto?
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 información 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 la Actividad de su hijo.
Esto proporciona una canalización para enviar datos a la actividad principal mediante setResult
. El método setResult toma un valor de resultado int y una intención que se devuelve a la actividad que realiza la llamada.
Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data");
setResult(Activity.RESULT_OK, resultIntent);
finish();
Para acceder a los datos devueltos en la anulación de actividad que llama onActivityResult
. El código de solicitud corresponde al número entero pasado en la startActivityForResult
llamada, mientras que el código de resultado y la intención de datos se devuelven desde la actividad secundaria.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case (MY_CHILD_ACTIVITY) : {
if (resultCode == Activity.RESULT_OK) {
// TODO Extract the data returned from the child Activity.
String returnValue = data.getStringExtra("some_key");
}
break;
}
}
}
La actividad 1 usa startActivityForResult :
startActivityForResult(ActivityTwo, ActivityTwoRequestCode);
Se lanza la Actividad 2 y puedes realizar la operación, para cerrar la Actividad haz esto:
Intent output = new Intent();
output.putExtra(ActivityOne.Number1Code, num1);
output.putExtra(ActivityOne.Number2Code, num2);
setResult(RESULT_OK, output);
finish();
Actividad 1: al regresar de la actividad anterior se llamará onActivityResult :
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ActivityTwoRequestCode && resultCode == RESULT_OK && data != null) {
num1 = data.getIntExtra(Number1Code);
num2 = data.getIntExtra(Number2Code);
}
}
ACTUALIZACIÓN: Respuesta al comentario de Seenu69, en la actividad dos,
int result = Integer.parse(EditText1.getText().toString())
+ Integer.parse(EditText2.getText().toString());
output.putExtra(ActivityOne.KEY_RESULT, result);
Luego, en la actividad uno,
int result = data.getExtra(KEY_RESULT);
Enviar datos de vuelta
Me ayuda a ver las cosas en contexto. Aquí hay un proyecto simple y completo para enviar datos. En lugar de proporcionar los archivos de diseño xml, aquí hay una imagen.
Actividad principal
- Inicie la Segunda Actividad con
startActivityForResult
, proporcionándole un código de resultado arbitrario. - Anular
onActivityResult
. Esto se llama cuando finaliza la Segunda Actividad. Puede asegurarse de que en realidad sea la Segunda Actividad verificando el código de solicitud. (Esto es útil cuando estás iniciando varias actividades diferentes a partir de la misma actividad principal). - Extrae los datos que obtuviste de la declaración
Intent
. Los datos se extraen mediante un par clave-valor.
Actividad principal.java
public class MainActivity extends AppCompatActivity {
private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// "Go to Second Activity" button click
public void onButtonClick(View view) {
// Start the SecondActivity
Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
}
// This method is called when the second activity finishes
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Check that it is the SecondActivity with an OK result
if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Get String data from Intent
String returnString = data.getStringExtra("keyName");
// Set text view with string
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(returnString);
}
}
}
}
Segunda actividad
- Coloque los datos que desea enviar a la actividad anterior en un archivo
Intent
. Los datos se almacenan utilizandoIntent
un par clave-valor. - Establezca el resultado
RESULT_OK
y agregue la intención que contiene sus datos. - Convocatoria
finish()
para cerrar la Segunda Actividad.
SegundaActividad.java
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
// "Send text back" button click
public void onButtonClick(View view) {
// Get the text from the EditText
EditText editText = (EditText) findViewById(R.id.editText);
String stringToPassBack = editText.getText().toString();
// Put the String to pass back into an Intent and close this activity
Intent intent = new Intent();
intent.putExtra("keyName", stringToPassBack);
setResult(RESULT_OK, intent);
finish();
}
}
Otras notas
- Si estás en un Fragmento, no sabrá el significado de
RESULT_OK
. Sólo usa el nombre completo:Activity.RESULT_OK
.
Ver también
- Respuesta más completa que incluye pasar datos hacia adelante
- Convenciones de nomenclatura para la cadena de claves
FirstActivity usa startActivityForResult:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int requestCode); // suppose requestCode == 2
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 2)
{
String message=data.getStringExtra("MESSAGE");
}
}
En SecondActivity, llame a setResult() eventos onClick o onBackPressed()
Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(Activity.RESULT_OK, intent);