Pregunta ¿Cómo administrar `startActivityForResult` en Android?


En mi actividad, llamo a una segunda actividad de la actividad principal startActivityForResult. En mi segunda actividad hay algunos métodos que terminan esta actividad (tal vez sin resultado), sin embargo, solo uno de ellos arroja un resultado.

Por ejemplo, de la actividad principal llamo una segunda. En esta actividad, estoy verificando algunas características del teléfono como, por ejemplo, si tiene una cámara. Si no tiene, entonces cerraré esta actividad. Además, durante la preparación de MediaRecorder o MediaPlayer si ocurre un problema, cerraré esta actividad.

Si su dispositivo tiene una cámara y la grabación está completa, luego de grabar un video si el usuario hace clic en el botón hecho, entonces enviaré el resultado (dirección del video grabado) a la actividad principal.

¿Cómo verifico el resultado de la actividad principal?


780
2018-05-02 03:03


origen


Respuestas:


De tu FirstActivity llama a SecondActivity utilizando startActivityForResult() método

Por ejemplo:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

En tus SecondActivity establecer los datos a los que desea regresar FirstActivity. Si no desea regresar, no configure ninguno.

Por ejemplo: en secondActivity si desea enviar datos de vuelta:

Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

Si no desea devolver datos:

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

Ahora en su clase FirstActivity escriba el siguiente código para onActivityResult() método.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }
}//onActivityResult

2071
2018-05-02 03:36



¿Cómo verificar el resultado de la actividad principal?

Tienes que anular Activity.onActivityResult() luego verifica sus parámetros:

  • requestCode identifica qué aplicación arrojó estos resultados. Esto es definido por ti cuando llamas startActivityForResult().
  • resultCode le informa si esta aplicación tuvo éxito, falló o algo diferente
  • data contiene cualquier información devuelta por esta aplicación. Esto podría ser null.

40
2018-05-02 03:07



Complementando la respuesta de @ Nishant, la mejor manera de devolver el resultado de la actividad es:

Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();

Estaba teniendo un problema con

new Intent();

Entonces descubrí que la forma correcta es usar

getIntent();

para obtener la intención actual


30
2018-05-26 20:40



Ejemplo

Para ver todo el proceso en contexto, aquí hay una respuesta suplementaria. Ver mi respuesta más completa para más explicaciones

enter image description here

MainActivity.java

public class MainActivity extends AppCompatActivity {

    // Add a different request code for every activity you are starting from here
    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) { // Activity.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);
            }
        }
    }
}

SecondActivity.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();
    }
}

22
2017-12-05 08:36



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:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_CANCELED) {
        return;
    }

    global_lat = data.getDoubleExtra("LATITUDE", 0);
    global_lng = data.getDoubleExtra("LONGITUDE", 0);
    new_latlng = true;
}

@Override
protected void onResume() {
    super.onResume();

    if(new_latlng)
    {
        PhysicalTagProperties.this.setLocation(global_lat, global_lng);
        new_latlng=false;
    }
}

Esto parece tonto pero funciona bastante bien.


9
2018-03-08 13:54



Para aquellos que tienen problemas con Código de solicitud incorrecto en onActivityResult

Si estás llamando startActivityForResult() de tu Fragment, el Código de solicitud es cambiado por la Actividad que posee el Fragmento.

Si quiere obtener el código de resultado correcto en su actividad, intente esto:

Cambio:

startActivityForResult(intent, 1); A:

getActivity().startActivityForResult(intent, 1);


9
2017-10-23 12:58



Primero usas startActivityForResult() con parámetros en primer Activity y si quieres enviar datos desde el segundo Activity primero Activity luego pasa el valor usando Intent con setResult() método y obtener esa información en el interior onActivityResult() método en primer Activity.


2
2017-09-30 12:30



Problema muy común en Android
Se puede dividir en 3 piezas
1) comienza 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)

1) startActivity B

Intent i = new Intent(A.this, B.class);
startActivity(i);

2) Establecer los datos solicitados

En esta parte, usted decide si desea enviar datos de vuelta 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 realidad A
Al hacer clic en el botón b2 no se envían datos.

Enviando datos 

b1......clickListener
{
   Intent resultIntent = new Intent();
   resultIntent.putExtra("Your_key","Your_value");
   setResult(RES_CODE_A,resultIntent);
   finish();
}

No enviando datos

b2......clickListener
    {
       setResult(RES_CODE_B,new Intent());
       finish();
    }

el usuario hace clic en el botón Atrás
Por defecto, el resultado se establece con el código de respuesta Activity.RESULT_CANCEL

3) Recuperar el resultado

Para esa anulación en el método de respuesta de actividad

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RES_CODE_A) {

     // b1 was clicked 
   String x = data.getStringExtra("RES_CODE_A");

}
else if(resultCode == RES_CODE_B){

   // b2 was clicked

}
else{
   // back button clicked 
}
}

0
2017-12-22 09:54