Mulai aktivitas dengan parameter

292

Saya sangat baru dalam pengembangan Android.

Saya ingin membuat dan memulai kegiatan untuk menampilkan informasi tentang permainan. Saya menunjukkan informasi itu bahwa saya memerlukan gameId.

Bagaimana saya bisa memberikan ID game ini ke aktivitas? ID permainan benar-benar diperlukan sehingga saya tidak ingin membuat atau memulai aktivitas jika tidak memiliki ID.

Sepertinya aktivitas hanya memiliki satu konstruktor dengan satu parameter.

Bagaimana saya bisa melakukan itu?

Terima kasih.

VansFannel
sumber

Jawaban:

506

Masukkan yang intmana id Anda ke yang baru 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();

Kemudian ambil id di yang baru Activity:

Bundle b = getIntent().getExtras();
int value = -1; // or other values
if(b != null)
    value = b.getInt("key");
Wroclai
sumber
42
Anda mungkin ingin memastikan b! = Null sebelum Anda mulai mengambilnya
Andrew
Bagaimana "b" menjadi nol dalam aktivitas kedua dalam kode ini? Saya mendapatkan b adalah nol pada metode membuat aktivitas kedua.
Murat Çorlu
3
B dapat menjadi nol, katakanlah Anda ingin memulai aktivitas ini dari tempat lain dan Anda melakukannya dengan cara standar, tanpa params. Ini akan melempar NPE. Anda harus selalu menganggap params ini opsional.
Gaspar de Elias
53
Tidak perlu membuat Bundel baru (dan jika Anda melakukan dokumentasi mengatakan Anda "harus" menggunakan nama paket untuk mengawali kunci Anda.) Cukup gunakan intent.putExtra(String, Int).
Sam
1
Orang bisa berpendapat bahwa lebih baik tidak melakukan cek nol. en.wikipedia.org/wiki/Fail-fast .
setholopolus
124

Cukup tambahkan data tambahan ke Intent yang Anda gunakan untuk menelepon aktivitas Anda.

Dalam aktivitas penelepon:

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

Di dalam onCreate () dari aktivitas yang Anda panggil:

Bundle b = getIntent().getExtras();
int id = b.getInt("id");
DavGin
sumber
1
apakah saya boleh meneruskan jenis objek kustom?
Amyth
1
@Athth Tidak, Anda harus menggunakan bundel seperti pada jawaban yang diterima.
AtlasRider
38

Saya suka melakukannya dengan metode statis dalam aktivitas kedua:

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

Kemudian dari aktivitas pertama Anda (dan untuk tempat lain), Anda cukup melakukan:

SecondActivity.start(this, "the.game.id");
pomber
sumber
Persis apa yang saya cari! Terima kasih
Matteo
1
Dalam metode onCreate tidak harus String gameId = intent.getStringExtra(EXTRA_EXTERNAL_ID);menjadiString gameId = intent.getStringExtra(EXTRA_GAME_ID);
marcusshep
Memiliki statika akan membuat pengujian Anda sangat sulit.
John Tribe
Apakah ini kebocoran memori? Melewatkan konteks menjadi metode statis sepertinya ide yang buruk bagi saya. Mengapa tidak mengembalikan maksud saja dan kemudian memulai aktivitas menggunakan niat itu dari kelas pertama?
AndroidDev
4

Kode Kotlin:

Mulai SecondActivity:

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

Dapatkan ID di 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
    }
}

di mana gameIdadalah String? (dapat null)

Francis
sumber
3

Jawaban yang ada (meneruskan data dalam yang Intentditeruskan ke startActivity()) menunjukkan cara normal untuk menyelesaikan masalah ini. Ada solusi lain yang dapat digunakan dalam kasus aneh di mana Anda membuat sebuah Aktivitas yang akan dimulai oleh aplikasi lain (misalnya, salah satu kegiatan edit dalam plugin Tasker ) dan karenanya tidak mengontrol Intentyang meluncurkan peluncuran Activity.

Anda bisa membuat kelas-dasar Activityyang memiliki konstruktor dengan parameter, kemudian kelas turunan yang memiliki konstruktor default yang memanggil konstruktor kelas-dasar dengan nilai, seperti:

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

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

Jika Anda perlu membuat parameter untuk diteruskan ke konstruktor kelas dasar, cukup ganti nilai yang dikodekan dengan panggilan fungsi yang mengembalikan nilai yang benar untuk diteruskan.

Trebor Rude
sumber