web-dev-qa-db-fra.com

Commencer une activité avec un paramètre

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

Je souhaite créer et démarrer une activité pour afficher des informations sur un jeu. Je montre cette information, j'ai besoin d'un gameId.

Comment puis-je passer cet identifiant de jeu à l'activité? L'identifiant du jeu est absolument nécessaire, je ne souhaite donc pas créer ou démarrer l'activité sans l'identifiant.

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

Comment puis je faire ça?

Merci.

273
VansFannel

Mettez un int qui est votre identifiant 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();

Puis récupérez l'identifiant dans votre nouveau Activity:

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

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

Edit: Oops, Charlie Sheen a été plus rapide.

116
DavGin

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, à partir de votre première activité (et pour n’importe où ailleurs), il vous suffit de faire:

SecondActivity.start(this, "the.game.id");
38
pomber

Les réponses existantes (transmettez les données dans la Intent passée à la startActivity()) indiquent la manière habituelle 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 lancée par une autre application (par exemple, l'une des activités d'édition d'un plugin Tasker ) et par conséquent pas contrôler la Intent qui lance la Activity.

Vous pouvez créer une classe de base Activity comportant un constructeur avec un paramètre, puis une classe dérivée comportant 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.

3
Trebor Rude

code Kotlin:

Démarrer le SecondActivity:

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

Obtenir l'identifiant 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
    }
}

gameId est String?(peut être null)

1
Francis