Comience una actividad con un parámetro

292

Soy muy nuevo en el desarrollo de Android.

Quiero crear e iniciar una actividad para mostrar información sobre un juego. Muestro esa información, necesito un gameId.

¿Cómo puedo pasar esta identificación del juego a la actividad? La ID del juego es absolutamente necesaria, así que no quiero crear o iniciar la actividad si no tiene la ID.

Es como si la actividad tiene solamente un constructor con un parámetro.

¿Cómo puedo hacer eso?

Gracias.

VansFannel
fuente

Respuestas:

506

Pon una intque sea tu identificación en la nueva 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();

Luego toma la identificación en tu nuevo Activity:

Bundle b = getIntent().getExtras();
int value = -1; // or other values
if(b != null)
    value = b.getInt("key");
Wroclai
fuente
42
Es posible que desee asegurarse de que b! = Null antes de comenzar a aprovecharlo
Andrew
¿Cómo puede "b" ser nulo en la segunda actividad en este código? Obtengo b es nulo en el método de creación de la segunda actividad.
Murat Çorlu
3
B puede ser nulo, digamos que desea comenzar esta actividad desde otro lugar y lo hace de la manera estándar, sin parámetros. Lanzará un NPE. Siempre debe considerar estos parámetros opcionales.
Gaspar de Elias
53
No es necesario crear un nuevo paquete (y si lo hace, la documentación dice que "debe" usar el nombre del paquete para prefijar sus claves). Simplemente use intent.putExtra(String, Int).
Sam
1
Se podría argumentar que es mejor no hacer una verificación nula. en.wikipedia.org/wiki/Fail-fast .
Setholopolus
124

Simplemente agregue datos adicionales a la intención que 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 de onCreate () de la actividad que llamas:

Bundle b = getIntent().getExtras();
int id = b.getInt("id");
DavGin
fuente
1
¿está bien pasar un tipo de objeto personalizado?
Amyth
1
@Amyth No, tienes que usar un paquete como en la respuesta aceptada.
AtlasRider
38

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, desde su primera actividad (y para cualquier otro lugar), simplemente haga:

SecondActivity.start(this, "the.game.id");
pomber
fuente
¡Exactamente lo que estaba buscando! Gracias
Matteo
1
En el método onCreate no debería String gameId = intent.getStringExtra(EXTRA_EXTERNAL_ID);serString gameId = intent.getStringExtra(EXTRA_GAME_ID);
marcusshep
Tener estática hará que sus pruebas sean muy difíciles.
John Tribe
¿Es esto una pérdida de memoria? Pasar el contexto a un método estático me parece una mala idea. ¿Por qué no simplemente devolver la intención y luego comenzar la actividad usando esa intención de la primera clase?
AndroidDev
4

Código de Kotlin:

Comience el SecondActivity:

startActivity(Intent(context, SecondActivity::class.java)
    .putExtra(SecondActivity.PARAM_GAME_ID, gameId))

Obtenga la identificación en SecondActivity:

class CaptureActivity : AppCompatActivity() {

    companion object {
        const val PARAM_GAME_ID = "PARAM_GAME_ID"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val gameId = intent.getStringExtra(PARAM_GAME_ID)
        // TODO use gameId
    }
}

donde gameIdestá String? (puede ser nulo)

Francis
fuente
3

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

Puede crear una clase base Activityque tenga un constructor con un parámetro, luego una clase derivada que tenga un constructor predeterminado que llame al constructor de la clase base con un valor, así:

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 devuelve el valor correcto para pasar.

Trebor grosero
fuente