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 astartActivityForResult()
. -
resultCode
le informa si esta aplicación fueresultCode
, fallida o algo diferente -
data
contienen cualquier información devuelta por esta aplicación. Esto puede sernull
.
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();
}
}