パラメータでアクティビティを開始する


292

私はAndroid開発の初心者です。

ゲームに関する情報を表示するアクティビティを作成して開始したいと思います。gameIdが必要な情報を表示します。

このゲームIDをアクティビティに渡すにはどうすればよいですか?ゲームIDは絶対に必要なので、IDがない場合はアクティビティを作成または開始しません。

それは、アクティビティが1つのパラメーターを持つ1 つのコンストラクターしか持っていないようなものです。

どうやってやるの?

ありがとう。

回答:


506

intあなたのIDであるを新しいに入れます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();

次に、新しいIDを取得しますActivity

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

42
あなたはそれをつかむ前にb!= nullを確認したいかもしれません
Andrew

このコードの2番目のアクティビティで「b」をnullにするにはどうすればよいですか?2番目のアクティビティのcreateメソッドでbがnullになる。
MuratÇorlu2011

3
Bはnullにすることができます。別の場所からこのアクティビティを開始して、パラメーターを指定せずに標準の方法で開始するとします。NPEをスローします。このパラメータは常にオプションであると考える必要があります。
Gaspar de Elias

53
新しいバンドルを作成する必要はありません(ドキュメントを作成する場合は、パッケージ名をキーのプレフィックスとして使用する必要があるとドキュメントに記載されています)。単にを使用しますintent.putExtra(String, Int)
サム

1
ヌルチェックを行わない方がよいと主張することができます。en.wikipedia.org/wiki/Fail-fast
setholopolus

124

アクティビティの呼び出しに使用するインテントにデータを追加するだけです。

発信者のアクティビティでは:

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

呼び出すアクティビティのonCreate()内:

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

1
カスタムオブジェクトタイプを渡しても大丈夫ですか?
Amyth

1
@Amythいいえ、受け入れられた回答のようにバンドルを使用する必要があります。
AtlasRider 2016年


38

私は2番目のアクティビティで静的メソッドを使ってそれをしたいです:

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

次に、最初のアクティビティから(および他の場所で)、次のようにします。

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

まさに私が探していたもの!ありがとう
Matteo

1
onCreateメソッドではないはずString gameId = intent.getStringExtra(EXTRA_EXTERNAL_ID);ですString gameId = intent.getStringExtra(EXTRA_GAME_ID);
marcusshep

静力学があると、テストが非常に難しくなります。
John Tribe

これはメモリリークですか?静的メソッドにコンテキストを渡すことは、私には悪い考えのようです。インテントを返し、そのインテントを使用して最初のクラスからアクティビティを開始しないのはなぜですか?
AndroidDev 2018

4

Kotlinコード:

を開始SecondActivity

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

IDを取得し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あるかString? (nullも可)


3

既存の回答(渡されたにデータをIntent渡すstartActivity())は、この問題を解決する通常の方法を示しています。別のアプリ(たとえば、タスカープラグインの編集アクティビティの1つ)によって開始されるアクティビティを作成しているために、Intentを起動するを制御しないという奇妙なケースで使用できる別のソリューションがありますActivity

次のようにActivity、パラメーターを持つコンストラクターを持つ基本クラスを作成してから、値を持つ基本クラスコンストラクターを呼び出すデフォルトコンストラクターを持つ派生クラスを作成できます。

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

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

基本クラスのコンストラクターに渡すパラメーターを生成する必要がある場合は、ハードコードされた値を、渡す正しい値を返す関数呼び出しに置き換えるだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.