|
||
|
|
|
|||||||
| Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
|
Herramientas |
|
#1
|
||||
|
||||
|
Duda onActivityResult !!!
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); Código:
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();
}
}
}
Código:
public void onClick(View view) {
Intent i = new Intent(this , Thirdactivity.class);
i.setData(Uri.parse("Pasamos a 3 activity"));
finish();
}
Pues bien , si en B pulso back para volver a A: Código:
@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();
}
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 |
|
|
|
#2
|
||||
|
||||
|
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. |
|
#3
|
||||
|
||||
|
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: Código:
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();
}
}
}
}
Código:
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();
}
}
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 |
|
#4
|
||||
|
||||
|
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". |
|
#5
|
||||
|
||||
|
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 |
|
#6
|
||||
|
||||
|
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: Código:
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();
}
Alguna solucion? |
|
#8
|
||||
|
||||
|
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?? |
|
#9
|
||||
|
||||
|
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. |
|
#10
|
||||
|
||||
|
Hola.
Funciona!!! Muchas gracias máquina!!! |
![]() |
Estás aquí
|
||||||
|
||||||