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

Respuesta
 
Herramientas
  #1  
Viejo 06/12/13, 22:26:47
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
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();
	            }            
	        }
	}
En la actividad B paso datos a una actividad C:

Código:
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:

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


  #2  
Viejo 06/12/13, 22:44:30
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
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.
Responder Con Cita
  #3  
Viejo 08/12/13, 11:49:29
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
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();
	            }            
	        }
	}
}
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:

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();
	}
		
}
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
Responder Con Cita
  #4  
Viejo 08/12/13, 13:20:32
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
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".
Responder Con Cita
  #5  
Viejo 08/12/13, 14:11:22
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
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
Responder Con Cita
  #6  
Viejo 08/12/13, 18:06:51
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
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();
	}
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?
Responder Con Cita
  #7  
Viejo 08/12/13, 18:29:26
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
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
Responder Con Cita
  #8  
Viejo 08/12/13, 18:49:37
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
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??
Responder Con Cita
  #9  
Viejo 08/12/13, 19:15:06
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
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.
Responder Con Cita
  #10  
Viejo 08/12/13, 20:28:47
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Hola.

Funciona!!! Muchas gracias máquina!!!
Responder Con Cita
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 20:52:11 (GMT +1)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /