2010-10-12 16 views
227

Soy muy nuevo en el desarrollo de Android.Iniciar una actividad con un parámetro

Quiero crear y comenzar una actividad para mostrar información sobre un juego. Muestro esa información Necesito un ID de juego.

¿Cómo puedo pasar la identificación de este juego a la actividad? La identificación del juego es absolutamente necesaria, por lo que no quiero crear o comenzar la actividad si no tiene la ID.

Parece que la actividad solo tiene un constructor con un parámetro.

¿Cómo puedo hacer eso?

Gracias.

Respuesta

398

Ponga un int que es su identificación en el nuevo Intent.

Intent intent = new Intent(FirstActivity.this, SecondActivity.class); 
Bundle b = new Bundle(); 
b.putInt("key", 1); //Your id 
intent.putExtras(b); //Put your id to your next Intent 
startActivity(intent); 
finish(); 

y luego agarre la identificación en su nueva Activity:

Bundle b = getIntent().getExtras(); 
int value = -1; // or other values 
if(b != null) 
    value = b.getInt("key"); 
+36

es posible que desee para asegurarse de que b! = null antes de comenzar a tomar de él – Andrew

+0

¿Cómo puede ser "n" nula en la segunda actividad de este código? Obtengo b es nulo en el método de creación de la segunda actividad. –

+2

B puede ser nulo, digamos que desea iniciar esta actividad desde otro lugar y lo hace de la manera estándar, sin parámetros. Lanzará un NPE.Siempre deberías considerar este parámetro opcional. –

100

Sólo añadir datos adicionales a la intención que se utiliza para llamar a su actividad.

En la actividad de la persona que llama:

Intent i = new Intent(this, TheNextActivity.class); 
i.putExtra("id", id); 
startActivity(i); 

Dentro del onCreate() de la actividad de llamar:

Bundle b = getIntent().getExtras(); 
int id = b.getInt("id"); 

Editar: Vaya, Charlie Sheen fue más rápido.

+1

¿está bien pasar un tipo de objeto personalizado? – Amyth

+1

@Amyth No, tienes que usar un paquete como en la respuesta aceptada. – AtlasRider

+0

Vea este @Amyth: http://stackoverflow.com/questions/14333449/passing-data-through-intent-using-serializable – Cold

3

Las respuestas existentes (pasan los datos en el Intent pasaron a startActivity()) muestran la forma normal de resolver este problema. Hay otra solución que se puede usar en el caso extraño en el que esté creando una actividad que iniciará otra aplicación (por ejemplo, una de las actividades de edición en un complemento Tasker) y, por lo tanto, no controla el Intent que lanza el Activity.

Puede crear una clase base Activity que tiene un constructor con un parámetro, una clase derivada que tiene un constructor predeterminado que llama al constructor de la clase base con un valor, como tan:

class BaseActivity extends Activity 
{ 
    public BaseActivity(String param) 
    { 
     // Do something with param 
    } 
} 

class DerivedActivity extends BaseActivity 
{ 
    public DerivedActivity() 
    { 
     super("parameter"); 
    } 
} 

Si necesita generar el parámetro para pasar al constructor de la clase base, simplemente reemplace el valor codificado con una llamada de función que devuelva el valor correcto para pasar.

31

me gusta hacerlo con un método estático en la segunda actividad:

private static final String EXTRA_GAME_ID = "your.package.gameId"; 

public static void start(Context context, String gameId) { 
    Intent intent = new Intent(context, SecondActivity.class); 
    intent.putExtra(EXTRA_GAME_ID, gameId); 
    context.startActivity(intent); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    Intent intent = this.getIntent(); 
    String gameId = intent.getStringExtra(EXTRA_GAME_ID); 
} 

Luego de su primera actividad (y de cualquier otro lugar), que acaba de hacer:

SecondActivity.start(this, "the.game.id"); 
+4

Esto hace que mi código sea más limpio. Gracias. –

+0

código realmente hermoso. –

+0

¡Exactamente lo que estaba buscando! Gracias – Matteo

Cuestiones relacionadas