Ver la Versión Completa : Duda onActivityResult !!!
manolazo
06/12/13, 22:26:47
Buenas a todos.
Tengo el siguiente problema:
Tengo la actividad digamos A en la cual paso datos a la actividad B mediante un startActivityForResult(i, 1);
public void onClick(View view) {
Intent i = new Intent(this,SecondActivity.class);
i.setData(Uri.parse("Pasamos a activity 2"));
startActivityForResult(i, 1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1) {
if (resultCode == RESULT_OK) {
Toast.makeText(this, data.getData().toString(), Toast.LENGTH_SHORT).show();
}
}
}
En la actividad B paso datos a una actividad C:
public void onClick(View view) {
Intent i = new Intent(this , Thirdactivity.class);
i.setData(Uri.parse("Pasamos a 3 activity"));
finish();
}
De actividad C volvemos a B.
Pues bien , si en B pulso back para volver a A:
@Override
public void onBackPressed() {
//super.onBackPressed();
Intent i = new Intent(this, PassingDataActivity.class);
i.setData(Uri.parse("Something passed back to main activity"));
setResult(RESULT_OK, i);
finish();
}
La actividad A no me recoge los datos de B si he pasado por C.
Si voy de A a B sin pasar por C si funciona el onActivityResult().
¿Hay alguna forma de que A recoja los datos de B independientemente de que desde B lance otras actividades y llame a finish();
Tiene que haber alguna forma de hacer esto, no?
Un saludo
kriogeN
06/12/13, 22:44:30
Yo lo hago y me funciona, algo no debes estar haciendo bien.
En mi caso:
A llama a B
B llama a C
C devuelve valores a B
En el onActivityResult de B, devuelvo valores a A y termino a B. (El usuario sólo ve que de C ha pasado a A sin pasar por B, pero realmente B sigue aún entre A y C hasta que se ejecuta su onActivityResult)
Más o menos es lo mismo que haces tú, no tiene porque funcionar una cosa y la otra no, ya te digo que algo no debes estar haciendo bien.
Por cierto, estoy dando por supuesto que el código que has puesto del "onClick" de B está mal, porque si no ahí esta el fallo.
manolazo
08/12/13, 11:49:29
Buenas.
Tal y como lo dices si estaría bien pero ver si resumo lo que trato de hacer.
Supongamos tengo la actividad A mediante la cual paso con un startActivityForResult(i, 1); el dato del nivel de un juego:
public class PassingDataActivity extends Activity {
int n=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void onClick(View view) {
Intent i = new Intent(this,SecondActivity.class);
i.putExtra("n",n);
startActivityForResult(i, 1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1) {
if (resultCode == RESULT_OK) {
Toast.makeText(this, String.valueOf(getIntent().getIntExtra("n",n)), Toast.LENGTH_SHORT).show();
}
}
}
}
El dato del nivel lo recojo en la actividad B, y cada vez que termino la pantalla al pulsar onClick se me cierra la actividad y se abre otra igaul que seria la misma actividad B pero recogiendo un nivel mas (n=1) y asi sucesivamente:
public class SecondActivity extends Activity {
int n;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity);
n=getIntent().getIntExtra("n", n);
Toast.makeText(this, String.valueOf(getIntent().getIntExtra("n",n)), Toast.LENGTH_SHORT).show();
}
public void onClick(View view) {
Intent i = new Intent(this , SecondActivity.class);
n++;
i.putExtra("n",n);
startActivity(i);
finish();
}
@Override
public void onBackPressed() {
//super.onBackPressed();
Intent i = new Intent(this, PassingDataActivity.class);
i.putExtra("n",n);
setResult(RESULT_OK, i);
finish();
}
}
Bien. Una vez que llego a cierto nivel n quiero que al volver hacia atras con onBackPressed() a la actividad A que pase la varaible n alcanzada, pero por lo que veo al haber cerrado con finish() todas las actividades B resulta que no pasa ningun valor.
Supongo que esto habra que hacerlo con unas preferencias compartidas ??
Los juegos donde se sube de nivel en una pantalla donde varian pocos variables se hacen sobre la misma actividad cerrandola y abriendola de nuevo??
Asi lo estoy haciendo con el mio y va bien, aunque el codigo un poco largo debido al paso de muchas variables a traves de intents cada vez que se reinicia nivel, se pulsa atras , etc. Estoy haciendo una chapuza? :-)
Un saludo
kriogeN
08/12/13, 13:20:32
El problema está en que cuando pulsas el onBackPressed no es la misma Activity que la que lanzaste para el onActivityResult.
Es decir, tienes A, lanzas B con un ForResult, esa lanza a otra B sin nada y termina la anterior B, y así sucesivamente. Cuando termina la última B efectivamente vuelve a A, porque ya no hay Bs entre A y la última B, pero el resultado que espera tiene que venir de la primera B, y no de la última.
Creo que lo mejor para tú caso es usar FLAG_ACTIVITY_CLEAR_TOP y volver a lanzar nuevamente a A con el parámetro "n".
manolazo
08/12/13, 14:11:22
Hola.
Es lo que veia que al ir finalizando todas las actividades B se perdio la conexion con la primera B y no devuleve nada.
Pues otra cosa nueva FLAG_ACTIVITY_CLEAR_TOP a investigar!!!
Gracias
manolazo
08/12/13, 18:06:51
Hola de nuevo.
si uso FLAG_ACTIVITY_CLEAR_TOP en el onClick de la segunda actividad y no llamo a finish(), efectivamente parece que se matan las sucesivas actividades B que se van llamando de forma recursiva:
public void onClick(View view) {
Intent i = new Intent(this , SecondActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
n++;
i.putExtra("n",n);
startActivity(i);
//finish();
}
@Override
public void onBackPressed() {
//super.onBackPressed();
Intent i = new Intent(this, PassingDataActivity.class);
i.putExtra("n",n);
setResult(RESULT_OK, i);
finish();
}
Ya que cuando se pulsa back llega directamente a A, pero me da la impresion de que la B que se queda en top no es la misma que al principio y no se pasa el resultado a A.
Alguna solucion?
kriogeN
08/12/13, 18:29:26
No, lo que decía es que en el onBackPressed de la última B lo que hagas es iniciar a A con FLAG_ACTIVITY_CLEAR_TOP
manolazo
08/12/13, 18:49:37
O sea añadiendo
@Override
public void onBackPressed() {
//super.onBackPressed();
Intent i = new Intent(this, PassingDataActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("n",n);
setResult(RESULT_OK, i);
finish();
}
y quitando el FLAG_ACTIVITY_CLEAR_TOP del onClick??
kriogeN
08/12/13, 19:15:06
No, digo esto:
@Override
public void onBackPressed() {
//super.onBackPressed();
Intent i = new Intent(this, PassingDataActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("n",n);
startActivity(i);
}
Y en el onCreate del PassingDataActivity tendrás que analizar si ahora llega el parámetro "n" o no llega.
manolazo
08/12/13, 20:28:47
Hola.
Funciona!!! Muchas gracias máquina!!!
vBulletin® v3.8.1, Copyright ©2000-2025, Jelsoft Enterprises Ltd.