เริ่มกิจกรรมด้วยพารามิเตอร์


293

ฉันใหม่มากในการพัฒนา Android

ฉันต้องการสร้างและเริ่มกิจกรรมเพื่อแสดงข้อมูลเกี่ยวกับเกม ฉันแสดงข้อมูลว่าฉันต้องการรหัสเกม

ฉันจะส่ง ID เกมนี้ไปยังกิจกรรมได้อย่างไร ID เกมจำเป็นอย่างยิ่งดังนั้นฉันไม่ต้องการสร้างหรือเริ่มกิจกรรมหากไม่มี ID

มันก็เหมือนกับการทำกิจกรรมได้มีเพียงหนึ่งตัวสร้างพารามิเตอร์หนึ่ง

ฉันจะทำสิ่งนั้นได้อย่างไร

ขอบคุณ

คำตอบ:


508

ใส่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();

จากนั้นคว้ารหัสในใหม่ของคุณActivity:

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

42
คุณอาจต้องการแน่ใจว่า b! = null ก่อนที่คุณจะเริ่มโลภ
Andrew

"b" จะเป็นโมฆะในกิจกรรมที่สองในรหัสนี้อย่างไร ฉันได้รับ b เป็นโมฆะในการสร้างวิธีการของกิจกรรมที่สอง
Murat Çorlu

3
B อาจเป็นโมฆะสมมติว่าคุณต้องการเริ่มกิจกรรมนี้จากที่อื่นและคุณทำแบบปกติโดยไม่มี params มันจะโยน NPE คุณควรพิจารณาพารามิเตอร์นี้เป็นตัวเลือกเสมอ
Gaspar de Elias

53
มันไม่จำเป็นที่จะสร้าง Bundle ใหม่ (และถ้าคุณทำเอกสารว่าคุณ "ต้อง" ใช้ชื่อแพคเกจเพื่อคำนำหน้าคีย์ของคุณ.) intent.putExtra(String, Int)เพียงแค่การใช้งาน
แซม

1
หนึ่งสามารถยืนยันว่ามันจะดีกว่าที่จะไม่ทำเช็คว่าง en.wikipedia.org/wiki/Fail-fast
setholopolus

124

เพียงเพิ่มข้อมูลพิเศษลงใน Intent ที่คุณใช้โทรหากิจกรรมของคุณ

ในกิจกรรมผู้โทร:

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


38

ฉันชอบที่จะทำมันด้วยวิธีคงที่ในกิจกรรมที่สอง:

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

สิ่งที่ฉันกำลังมองหา! ขอบคุณ
มัตเตโอ

1
ในวิธีการ onCreate ไม่ควรString gameId = intent.getStringExtra(EXTRA_EXTERNAL_ID);จะเป็นString gameId = intent.getStringExtra(EXTRA_GAME_ID);
marcusshep

การมีสถิตยศาสตร์จะทำให้การทดสอบของคุณยากมาก
John Tribe

นี่เป็นหน่วยความจำรั่วหรือไม่? การผ่านบริบทไปเป็นวิธีการแบบคงที่ดูเหมือนจะเป็นความคิดที่ไม่ดีสำหรับฉัน ทำไมไม่เพียงแค่คืนความตั้งใจแล้วเริ่มกิจกรรมโดยใช้ความตั้งใจนั้นจากชั้นหนึ่ง
AndroidDev

4

รหัส Kotlin:

เริ่มต้นSecondActivity:

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

รับรหัสใน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()) แสดงวิธีปกติในการแก้ปัญหานี้ มีวิธีอื่นที่สามารถนำมาใช้ในกรณีที่แปลกที่คุณกำลังสร้างกิจกรรมที่จะถูกตั้งขึ้นโดยแอปอื่นคือ (ตัวอย่างหนึ่งของการแก้ไขกิจกรรมในTaskerปลั๊กอิน) และดังนั้นจึงไม่ได้ควบคุมซึ่งเปิดตัวIntentActivity

คุณสามารถสร้างคลาสฐาน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.