Iniciar uma atividade com um parâmetro

292

Sou muito novo no desenvolvimento do Android.

Quero criar e iniciar uma atividade para mostrar informações sobre um jogo. Eu mostro essas informações que preciso de um código de jogo.

Como posso passar esse ID do jogo para a atividade? O ID do jogo é absolutamente necessário, por isso não quero criar ou iniciar a atividade se ele não tiver o ID.

É como se a atividade tivesse apenas um construtor com um parâmetro.

Como eu posso fazer isso?

Obrigado.

VansFannel
fonte

Respostas:

506

Coloque um intque é o seu ID no novo 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();

Em seguida, pegue o ID no seu novo Activity:

Bundle b = getIntent().getExtras();
int value = -1; // or other values
if(b != null)
    value = b.getInt("key");
Wroclai
fonte
42
Você pode querer certificar-se b = null antes de começar a pegar a partir dele!
Andrew
Como "b" pode ser nulo na segunda atividade deste código? Eu recebo b é nulo no método de criação da segunda atividade.
Murat Çorlu
3
B pode ser nulo, digamos que você queira iniciar esta atividade em outro local e faça da maneira padrão, sem parâmetros. Irá lançar um NPE. Você deve sempre considerar esses parâmetros opcionais.
Gaspar de Elias
53
Não é necessário criar um novo pacote (e se você fizer a documentação diz que "deve" usar o nome do pacote para prefixar suas chaves). Simplesmente use intent.putExtra(String, Int).
27412 Sam
1
Pode-se argumentar que é melhor não fazer uma verificação nula. en.wikipedia.org/wiki/Fail-fast .
setholopolus
124

Basta adicionar dados extras ao Intent que você usa para chamar sua atividade.

Na atividade do chamador:

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

Dentro do onCreate () da atividade que você chama:

Bundle b = getIntent().getExtras();
int id = b.getInt("id");
DavGin
fonte
1
há problema em passar um tipo de objeto personalizado?
Amyth 14/05
1
@ Amyth Não, você precisa usar um pacote como na resposta aceita.
AtlasRider
38

Eu gosto de fazer isso com um método estático na segunda atividade:

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);
}

Depois da sua primeira atividade (e para qualquer outro lugar), você apenas faz:

SecondActivity.start(this, "the.game.id");
pomber
fonte
Exatamente o que eu estava procurando! Obrigado
Matteo
1
No método onCreate não deve String gameId = intent.getStringExtra(EXTRA_EXTERNAL_ID);serString gameId = intent.getStringExtra(EXTRA_GAME_ID);
marcusshep
Ter estática tornará seus testes muito difíceis.
John Tribe
Isso é um vazamento de memória? Passar o contexto para um método estático parece uma má ideia para mim. Por que não apenas devolver a intenção e depois iniciar a atividade usando essa intenção da primeira aula?
AndroidDev
4

Código Kotlin:

Inicie o SecondActivity:

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

Obtenha o ID em 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
    }
}

onde gameIdestá String? (pode ser nulo)

Francis
fonte
3

As respostas existentes (passe os dados do Intentpassado para startActivity()) mostram a maneira normal de resolver esse problema. Existe outra solução que pode ser usada no caso ímpar de você criar uma Atividade que será iniciada por outro aplicativo (por exemplo, uma das atividades de edição em um plug-in Tasker ) e, portanto, não controla a Intentque inicia Activity.

Você pode criar uma classe base Activityque possui um construtor com um parâmetro e, em seguida, uma classe derivada que possui um construtor padrão que chama o construtor da classe base com um valor, da seguinte forma:

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

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

Se você precisar gerar o parâmetro a ser transmitido ao construtor da classe base, basta substituir o valor codificado por uma chamada de função que retorne o valor correto a ser transmitido.

Trebor Rude
fonte