intent getintent android android-intent android-activity startactivityforresult

getintent - ¿Cómo gestionar `startActivityForResult` en Android?



startactivityforresult fragment (9)

En mi actividad, estoy llamando a una segunda actividad de la actividad principal mediante startActivityForResult . En mi segunda actividad hay algunos métodos que terminan esta actividad (quizás sin resultado), sin embargo, solo uno de ellos devuelve un resultado.

Por ejemplo, desde la actividad principal llamo a una segunda. En esta actividad estoy comprobando algunas características del teléfono, como si tiene una cámara. Si no lo 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 se realiza por completo, luego, después de grabar un video, si un usuario hace clic en el botón "Hecho", enviaré el resultado (dirección del video grabado) a la actividad principal.

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


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

Debe anular Activity.onActivityResult() luego verificar sus parámetros:

  • requestCode identifica qué aplicación devolvió estos resultados. Esto lo define usted cuando llama a startActivityForResult() .
  • resultCode le informa si esta aplicación fue resultCode , fallida o algo diferente
  • data contienen cualquier información devuelta por esta aplicación. Esto puede ser null .

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 problemas con

new Intent();

Entonces descubrí que la forma correcta es usando

getIntent();

para obtener la intención actual


Desde su FirstActivity llame al SecondActivity usando startActivityForResult()

Por ejemplo:

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

En su SecondActivity establezca los datos que desea volver a FirstActivity . Si no desea volver, no establezca ninguna.

Por ejemplo: en secondActivity si desea devolver datos:

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

Si no quieres devolver datos:

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

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

@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


La respuesta de @Nishant es correcta. En mi caso, nunca se llamó a onActivityResult debido a la configuración en AndroidManifest. Asegúrese de que su segunda actividad (o el remitente) no haya configurado esta línea en el manifiesto de Android.

<activity android:name=".SecondViewActivity" android:parentActivityName=".FirstActivity"/>

Si es así, elimina android:parentActivityName=".FirstActivity"


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

Si está llamando a startActivityForResult() desde su Fragment , el startActivityForResult() se modifica por la Actividad que posee el Fragmento.

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

Cambio:

startActivityForResult(intent, 1); A:

getActivity().startActivityForResult(intent, 1);


Primero use startActivityForResult() con parámetros en la primera Activity y si desea enviar datos de la segunda Activity a la primera Activity , pase el valor usando el método Intent con setResult() y obtenga esos datos dentro del método onActivityResult() en la primera Activity .


Problema muy común en Android
Se puede descomponer 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)

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 devolver los datos o no cuando ocurre un evento en particular.
Ej .: En la actividad B hay un EditText y dos botones b1, b2.
Al hacer clic en el botón b1 se envían los datos a la actividad A
Al hacer clic en el botón b2 no se envía ningún dato.

Enviando datos

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

No enviar datos

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

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

3) Recuperar el resultado

Para esa anulación del método onActivityResult

@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 } }


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 su lugar, puede 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.


Ejemplo

Para ver todo el proceso en contexto, aquí hay una respuesta complementaria. Ver mi respuesta completa para más explicación.

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