Démarrer une activité avec un paramètre

292

Je suis très nouveau sur le développement Android.

Je veux créer et démarrer une activité pour afficher des informations sur un jeu. Je montre ces informations dont j'ai besoin d'un gameId.

Comment puis-je transmettre cet ID de jeu à l'activité? L'ID du jeu est absolument nécessaire, donc je ne veux pas créer ou démarrer l'activité si elle n'a pas l'ID.

C'est comme si l'activité n'avait qu'un seul constructeur avec un seul paramètre.

Comment puis je faire ça?

Merci.

VansFannel
la source

Réponses:

506

Mettez un intqui est votre id dans le nouveau 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();

Ensuite, saisissez l'identifiant dans votre nouveau Activity:

Bundle b = getIntent().getExtras();
int value = -1; // or other values
if(b != null)
    value = b.getInt("key");
Wroclai
la source
42
Vous voudrez peut-être vous assurer que b! = Null avant de commencer à l'attraper
Andrew
Comment "b" peut-il être nul dans la deuxième activité de ce code? J'obtiens b est nul sur la méthode de création de la deuxième activité.
Murat Çorlu
3
B peut être nul, disons que vous voulez démarrer cette activité à partir d'un autre endroit et que vous le faites de la manière standard, sans paramètres. Il lancera un NPE. Vous devez toujours considérer ces paramètres comme facultatifs.
Gaspar de Elias
53
Il n'est pas nécessaire de créer un nouveau Bundle (et si vous le faites, la documentation indique que vous "devez" utiliser le nom du package pour préfixer vos clés.) Utilisez simplement intent.putExtra(String, Int).
Sam
1
On pourrait dire qu'il vaut mieux ne pas faire de vérification nulle. en.wikipedia.org/wiki/Fail-fast .
setholopolus
124

Ajoutez simplement des données supplémentaires à l'intention que vous utilisez pour appeler votre activité.

Dans l'activité de l'appelant:

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

Dans le onCreate () de l'activité que vous appelez:

Bundle b = getIntent().getExtras();
int id = b.getInt("id");
DavGin
la source
1
est-il correct de passer un type d'objet personnalisé?
Amyth
1
@Amyth Non, vous devez utiliser un bundle comme dans la réponse acceptée.
AtlasRider
38

J'aime le faire avec une méthode statique dans la deuxième activité:

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

Ensuite, dès votre première activité (et pour n'importe où ailleurs), il vous suffit de:

SecondActivity.start(this, "the.game.id");
bombardier
la source
Exactement ce que je cherchais! Merci
Matteo
1
Dans la méthode onCreate ne devrait pas String gameId = intent.getStringExtra(EXTRA_EXTERNAL_ID);êtreString gameId = intent.getStringExtra(EXTRA_GAME_ID);
marcusshep
Avoir de la statique rendra vos tests très difficiles.
John Tribe
Est-ce une fuite de mémoire? Passer le contexte dans une méthode statique me semble une mauvaise idée. Pourquoi ne pas simplement retourner l'intention, puis commencer l'activité en utilisant cette intention de la première classe?
AndroidDev
4

Code Kotlin:

Démarrez SecondActivity:

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

Obtenez l'ID dans 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
    }
}

gameIdest String? (peut être nul)

Francis
la source
3

Les réponses existantes (passez les données dans le Intentpassé à startActivity()) montrent la manière normale de résoudre ce problème. Il existe une autre solution qui peut être utilisée dans le cas étrange où vous créez une activité qui sera démarrée par une autre application (par exemple, l'une des activités de modification dans un plugin Tasker ) et ne contrôle donc pas celui Intentqui lance le Activity.

Vous pouvez créer une classe de base Activityqui a un constructeur avec un paramètre, puis une classe dérivée qui a un constructeur par défaut qui appelle le constructeur de la classe de base avec une valeur, comme suit:

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

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

Si vous devez générer le paramètre à transmettre au constructeur de la classe de base, remplacez simplement la valeur codée en dur par un appel de fonction qui renvoie la valeur correcte à transmettre.

Trebor Rude
la source