การใช้ startActivityForResult วิธีรับ requestCode ในกิจกรรมลูก


88

ฉันมีกิจกรรมสี่อย่างพูดว่า A, B, C และ D สถานการณ์ของฉันคือ A จะเริ่มกิจกรรม B โดย startActivityForResult

startActivityForResult(new Intent(this,B.class),ONE);

ในสถานการณ์อื่นฉันจะ B กับสถานการณ์อื่น ชอบ

 startActivityForResult(new Intent(this,B.class),TWO);

ใน B ฉันต้องเรียก C หรือ D ขึ้นอยู่กับ requestCode คือถ้าต้องเริ่ม C else D.
ดังนั้นฉันต้องรู้วิธีตรวจสอบ requestCode ในกิจกรรมลูก (B ที่นี่)
กล่าวอีกนัยหนึ่งคือฉันต้องการรับรหัสคำขอที่กิจกรรม B เริ่มต้นด้วย

คำตอบ:


140

คุณสามารถส่งรหัสขอโดยใส่พิเศษ

intent.putExtra("requestCode", requestCode);   

หรือถ้าคุณได้ใช้startActivityForResultหลายครั้งแล้วดีกว่าการแก้ไขแต่ละครั้งคุณสามารถในของคุณเพิ่มรหัสมีเช่นนี้ overridestartActivityForResultActivity

@Override
    public void startActivityForResult(Intent intent, int requestCode) {
        intent.putExtra("requestCode", requestCode);
        super.startActivityForResult(intent, requestCode);
    }

ดังนั้นไม่จำเป็นต้องแก้ไข startActivityForResult ของคุณทั้งหมด
หวังว่ามันจะช่วยคุณได้


51
ไม่มีทางที่กิจกรรมเด็กจะได้รับรหัสคำขอจริงหรือ?
i_am_jorf

1
จนถึงตอนนี้เพื่อความรู้ที่ดีที่สุดของฉันฉันคิดว่าไม่มีทางอื่น
Labeeb Panampullan

17
สงสัยในสิ่งเดียวกัน - นี่คือหนึ่งในสิ่งเหล่านั้นใน Android APIs ที่ไม่สมเหตุสมผลเลย
Artem Russakovskii

9
startActivityForResult สามารถใช้เพื่อเริ่มกิจกรรมในแอพอื่นได้ requestCode เป็นเรื่องส่วนตัวของแอปของคุณ ในแง่นี้มันสมเหตุสมผล Intent ไม่มีวิธีการดังกล่าวและแนวทางที่ถูกต้องคือ setAction ให้คำแนะนำว่าคุณต้องการให้กิจกรรมทำอะไร
Maciej Beimcik

28

รหัสคำขอจะไม่ถูกส่งไปยังกิจกรรมที่เริ่มต้นโดยอัตโนมัติเนื่องจากไม่ (และไม่ควร) จำเป็นต้องทราบค่านี้ เพียงแค่ต้องรู้ว่าต้องทำอย่างไรและไม่ได้เริ่มต้นจากที่ใด

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

การเริ่มต้นกิจกรรมเป็นอะนาล็อกแบบอะซิงโครนัสของการเรียกเมธอดซึ่งในกรณีนี้คุณจะได้รับผลลัพธ์ในเมธอดพิเศษ onActivityResult () ในวิธีนี้คุณต้องรู้ว่าจะทำอย่างไรกับผลลัพธ์ที่คุณเพิ่งได้รับและคุณมีรหัสคำขอสำหรับสิ่งนี้

เพื่อให้ชัดเจนขึ้นเล็กน้อยว่าเหตุใดจึงไม่ควรส่งรหัสคำขอเป็นพารามิเตอร์ให้พิจารณากิจกรรมตัวอย่างที่แสดงผลิตภัณฑ์ที่คุณสามารถซื้อได้ ในกิจกรรมนี้มีปุ่มสองปุ่มที่ระบุว่า "ซื้อ" และ "เข้าสู่ระบบ" (เนื่องจากคุณยังไม่ได้เข้าสู่ระบบ) การกด "เข้าสู่ระบบ" จะเริ่มกิจกรรมชื่อ "เข้าสู่ระบบ" ซึ่งจะพยายามเข้าสู่ระบบผู้ใช้โดยใช้ข้อมูลที่ให้มา การกด "ซื้อ" ก่อนอื่นจะเริ่มกิจกรรม "เข้าสู่ระบบ" เดียวกันและหากการเข้าสู่ระบบสำเร็จให้เริ่มกิจกรรมซื้อ

ตอนนี้ปุ่ม "เข้าสู่ระบบ" ใช้รหัสคำขอ 1 เพื่อเริ่มกิจกรรมการเข้าสู่ระบบ แต่ปุ่ม "ซื้อ" ไม่สามารถใช้รหัสคำขอเดียวกันได้เนื่องจากจะต้องทำสิ่งที่แตกต่างออกไปหากการเข้าสู่ระบบสำเร็จ ดังนั้นปุ่ม "ซื้อ" จึงใช้รหัสคำขอ 2

ในกิจกรรม "เข้าสู่ระบบ" คุณอาจได้รับรหัสคำขอที่แตกต่างกันสองรหัสขึ้นอยู่กับว่าถูกเรียกมาจากที่ใด แต่คุณจะต้องทำตามขั้นตอนเดียวกัน

ดังนั้นหากคุณส่งรหัสคำขอเป็นพารามิเตอร์คุณจะได้รหัสที่ต้องทำสิ่งเดียวกันสำหรับรหัสคำขอที่แตกต่างกันสองสามรหัสเช่น:

if (requestCode == LOGIN || requestCode == BUY) {
    // ...
} else ...

นอกจากนี้คุณยังจะต้องจัดเก็บค่าคงที่ของรหัสคำขอในตำแหน่งศูนย์กลางเช่นคลาสชื่อ RequestCodes

ในระยะสั้นควรใช้รหัสคำขอเพื่อตัดสินใจว่าจะทำอย่างไรกับผลลัพธ์ที่ได้รับ ด้วยวิธีนี้คุณจะได้รับโค้ดแบบแยกส่วนมากขึ้นดูแลรักษาง่ายขึ้นและขยายโค้ดได้ง่ายขึ้น


1
จะเกิดอะไรขึ้นถ้ามันเป็น "ผู้จัดการ" ของการจัดเรียงและคุณต้องการให้รหัสคำขอเข้ามาเพื่อ "บันทึก" ค่าบางค่า (ค่าที่บันทึกไว้เป็นค่าพิเศษ) รหัสคำขออื่นที่จะ "เรียกคืน" ค่า (และส่งคืนเป็นค่าพิเศษ) แต่ภายในกิจกรรมนี้พวกเขายังสามารถจัดการค่าที่บันทึกไว้โดยรวมเช่นการเปลี่ยนชื่อแก้ไขการลบ ฯลฯ คุณคิดอย่างไรกับบางสิ่งเช่นนั้น ฉันคิดว่ามันจะป้องกันการทำซ้ำรหัส / กิจกรรมเพื่อดำเนินการเดียวกัน
JRomero

@ J.Romero อย่าทำอย่างนั้นมันจะทำให้เรื่องยุ่งยาก เพียงใส่ฟังก์ชันนั้นในคลาส (ยูทิลิตี้ / ซิงเกิลตัน) คุณอาจต้องการดูHandler and Service
Szabolcs Berecz

3
Szabolcs กิจกรรมของเด็กแม้ว่าจะ "ไม่จำเป็นต้องทราบค่านี้" ก็อาจจำเป็นต้องส่งต่อค่านี้ไปยังกิจกรรมถัดไปเป็นลูกโซ่ แดกดันเราจำเป็นต้องเขียนโค้ดซ้ำซ้อนสำหรับสิ่งนี้ สำหรับบางสิ่งที่เราไม่จำเป็นต้องรู้มากเท่าที่เราจะได้รับการบรรยายเพิ่มเติมเพื่ออ่านเกี่ยวกับสิ่งที่เราไม่ควรทำ
user250343

ฉันไม่เห็นว่าสิ่งนี้แสดงให้เห็นว่าเหตุใดจึงควรปฏิเสธกิจกรรมย่อยในการเข้าถึงรหัสคำขอ ฉันไม่แน่ใจด้วยซ้ำว่าทำไมการเข้าถึงรหัสคำขอจึงจำเป็นในตัวอย่างเฉพาะของคุณเมื่อพิจารณาจากการซื้อตอนนี้และการโทรเข้าสู่ระบบเป็นกิจกรรมสองอย่างที่แยกจากกัน
Drazen Bjelovuk

1
@EvanR. บางทีสถาปัตยกรรมที่ดีกว่าก็คือการย่อยกิจกรรมรายการ "หลัก" ลงในกิจกรรมเพิ่ม / แก้ไขแยกต่างหาก ดังนั้นจึงมีการใช้โค้ดซ้ำน้อยที่สุด แต่แต่ละกิจกรรมสามารถเรียกใช้งานได้อย่างอิสระ
Dane Powell

11

ฉันลงเอยด้วยการใช้การกระทำตามเจตนาที่กำหนดเองเพื่อส่งข้อมูลประเภทนี้ไปยังกิจกรรมการเปิดตัว

protected static final String ACTION_DO_C = "do_c";
protected static final String ACTION_DO_D = "do_d";

ถ้าอย่างนั้นคุณจะชอบ:

final Intent intent = new Intent(this,B.class)
intent.setAction(ACTION_DO_C);
startActivityForResult(intent,ONE);

และในกิจกรรมBคุณจะได้รับการดำเนินการอย่างง่ายดาย:

getIntent().getAction();

ใช้งานได้อย่างมีเสน่ห์คำตอบที่ดีที่สุดจริงๆ ขอบคุณ.
YvesLeBorg

0

คุณสามารถใช้ getCallingActivity () เพื่อรับกิจกรรมที่เริ่มต้นกิจกรรมปัจจุบันและจะได้รับค่าผลลัพธ์พร้อมรหัสตอบกลับในตอนท้าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.