Enviar datos a la actividad principal en Android

Resuelto Rajapandian asked hace 54 años • 0 respuestas

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?

Rajapandian avatar Jan 01 '70 08:01 Rajapandian
Aceptado

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 startActivityForResultpara 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 startActivityForResultllamada, 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;
    } 
  }
}
Reto Meier avatar Jun 03 '2009 22:06 Reto Meier

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);
jimmithy avatar Nov 13 '2012 14:11 jimmithy

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.

ingrese la descripción de la imagen aquí

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 utilizando Intentun par clave-valor.
  • Establezca el resultado RESULT_OKy 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
Suragch avatar Dec 05 '2016 08:12 Suragch

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);
Vijay avatar Dec 10 '2015 11:12 Vijay