"มัด" ในแอปพลิเคชัน Android คืออะไร


คำตอบ:


278

โดยทั่วไปการรวมกลุ่มจะใช้สำหรับการส่งผ่านข้อมูลระหว่างกิจกรรม Android ต่างๆ ขึ้นอยู่กับคุณว่าคุณต้องการส่งผ่านค่าใด แต่กลุ่มรวมสามารถเก็บค่าทุกประเภทและส่งผ่านไปยังกิจกรรมใหม่ได้

คุณสามารถใช้สิ่งนี้:

Intent intent = new...
Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("myKey", AnyValue);  
startActivity(intent);

คุณสามารถรับค่าที่ส่งผ่านได้โดยทำดังนี้

Bundle extras = intent.getExtras(); 
String tmp = extras.getString("myKey");

คุณสามารถหาข้อมูลเพิ่มเติมได้ที่:


3
ทำไมไม่ใช้ System.object and cast โดยตรง
2557

79

ส่งผ่านข้อมูลระหว่างกิจกรรมโดยใช้BundleและIntentวัตถุ


คุณสร้างBundleวัตถุเป็นครั้งแรก

Bundle b = new Bundle();

จากนั้นเชื่อมโยงข้อมูลสตริงที่จัดเก็บไว้anystringด้วยคีย์บันเดิล"myname"

b.putString("myname", anystring);

ตอนนี้สร้างIntentวัตถุ

Intent in = new Intent(getApplicationContext(), secondActivity.class);

ส่งวัตถุบันเดิลbไปที่เจตนา

in.putExtras(b);

และเริ่มกิจกรรมที่สอง

startActivity(in);

ในกิจกรรมที่สองเราต้องเข้าถึงข้อมูลที่ส่งผ่านจากกิจกรรมแรก

Intent in = getIntent();

ตอนนี้คุณต้องได้รับข้อมูลจากชุดข้อมูล

Bundle b = in.getExtras();

สุดท้ายรับค่าของข้อมูลสตริงที่เกี่ยวข้องกับคีย์ชื่อ "myname"

String s = b.getString("myname");

นี่เป็นคำตอบที่ดีจริงๆขอบคุณสำหรับสิ่งนั้น
Abhishek Garg

68

ฉันต้องเพิ่มว่าชุดข้อมูลนั้นถูกใช้โดยกิจกรรมเพื่อส่งผ่านข้อมูลให้กับตัวเองในอนาคต

เมื่อหน้าจอหมุนหรือเมื่อเริ่มกิจกรรมอื่นวิธีการprotected void onSaveInstanceState(Bundle outState)จะถูกเรียกใช้และกิจกรรมจะถูกทำลาย ต่อมามีการสร้างอินสแตนซ์อื่นของกิจกรรมและpublic void onCreate(Bundle savedInstanceState)เรียกใช้ เมื่ออินสแตนซ์แรกของกิจกรรมถูกสร้างขึ้นบันเดิลจะเป็นค่าว่าง และหากชุดข้อมูลนั้นไม่เป็นโมฆะกิจกรรมจะดำเนินการต่อโดยเริ่มต้นธุรกิจของผู้เริ่มต้น

Android บันทึกข้อความในฟิลด์ข้อความโดยอัตโนมัติ แต่ไม่ได้บันทึกทุกอย่างและบางครั้งข้อบกพร่องที่ปรากฏขึ้น

อย่างไรก็ตามรูปแบบการต่อต้านที่พบมากที่สุดคือการสมมติว่าเป็นการonCreate()เริ่มต้น มันผิดเพราะมันจะต้องคืนสถานะด้วย

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

onPause()ยังทราบว่าวิธีการเดียวที่มีการเรียกร้องมีการประกันเมื่อมีกิจกรรมที่กำลังจะถูกทำลายคือ (ดูกราฟวงจรชีวิตของกิจกรรมในเอกสาร)


ทำไมต้องใช้มัดถ้าเราสามารถใช้แผนที่ได้? ขอบคุณเทด!
Ruchir Baronia

4
ชุดกิจกรรมไม่เพียง แต่ถูกใช้โดยกิจกรรม มันถูกใช้โดย Fragment เพื่อรักษาสถานะหลังจากหมุน
Kai Wang

47

A Bundleเป็นอย่างมากเหมือนกับMapวัตถุJava ที่จับคู่Stringคีย์กับค่า มันถูกใช้เพื่อส่งผ่านข้อมูลระหว่างกิจกรรมและส่วนประกอบของแอปพลิเคชันอื่น ๆ มันยังถูกใช้โดยกรอบการทำงานเพื่อจับภาพและเรียกคืนข้อมูลสถานะ

เหตุผลที่ Android ไม่ได้ใช้Mapวัตถุเก่าแบบธรรมดาสำหรับเรื่องนี้นั่นMapก็คือความยืดหยุ่นเกินไป มันสามารถมีวัตถุ (เช่นพูด, I / O สตรีม) ที่ไม่สามารถต่อเนื่อง BundleAPI จำกัด ประเภทของวัตถุที่สามารถเพิ่มการมัดในลักษณะดังกล่าวว่าเนื้อหาของกลุ่มที่มีการรับประกันว่าจะ serializable กรอบการทำงานของ Android ขึ้นอยู่กับคุณสมบัตินี้

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


14

การรวมกลุ่มสามารถใช้ในการส่งข้อมูลโดยพลการจากกิจกรรมหนึ่งไปยังอีกกิจกรรมหนึ่งโดยเจตนา เมื่อคุณออกอากาศเจตนากิจกรรมที่สนใจ (และ BroadcastRecievers อื่น ๆ ) จะได้รับแจ้งเรื่องนี้ ความตั้งใจสามารถมี Bundle เพื่อให้คุณสามารถส่งข้อมูลเพิ่มเติมพร้อมกับเจตนา

การรวมกลุ่มเป็นการจับคู่คีย์ - ค่าดังนั้นในลักษณะที่เหมือนแฮช แต่ไม่ จำกัด อย่างเคร่งครัดในการแม็พวัตถุ String / Foo เดียว โปรดทราบว่าเฉพาะบางประเภทข้อมูลเท่านั้นที่ถือว่าเป็น "Parcelable" และมีการสะกดคำอย่างชัดเจนใน Bundle API


นี่เป็นเพียงคำตอบเดียวที่จะเข้าถึงคำถามของ OP จริงๆนั่นคือ Bundle คืออะไร stackoverflow.com/a/6236801/1588163ให้ข้อมูลเชิงลึกเพิ่มเติม
clapas

ทำไมต้องใช้มัดถ้าเราสามารถใช้แผนที่ได้? ขอบคุณ!
Ruchir Baronia

@RuchirBaronia ไม่มีเหตุผลพิเศษที่จะใช้ Bundle เว้นแต่ว่าคุณต้องการส่งต่อไปยังส่วนหนึ่งของ Android API ที่ต้องใช้วัตถุ Bundle
scriptocalypse

8

เพียงแค่สร้างมัด


Bundle simple_bundle=new Bundle();
simple_bundle.putString("item1","value1");
Intent i=new Intent(getApplicationContext(),this_is_the_next_class.class);
i.putExtras(simple_bundle);
startActivity(i);

ใน "this_is_the_next_class.class"

คุณสามารถดึงไอเท็มแบบนี้ได้

Intent receive_i=getIntent();
Bundle my_bundle_received=receive_i.getExtras();
my_bundle_received.get("item1");
Log.d("Value","--"+my_bundle_received.get("item1").toString);

5

บันเดิลถูกใช้เพื่อส่งผ่านข้อมูลระหว่างกิจกรรม คุณสามารถสร้างบันเดิลส่งต่อไปยัง Intent ที่เริ่มต้นกิจกรรมซึ่งสามารถใช้จากกิจกรรมปลายทาง


3

บันเดิล: - การจับคู่จากค่าสตริงไปยังประเภทพัสดุภัณฑ์ต่างๆ

บันเดิลมักจะใช้สำหรับส่งข้อมูลระหว่างกิจกรรมต่าง ๆ ของ android

เมื่อเราเรียก onPause () จากนั้น onStop () และจากนั้นในลำดับย้อนกลับ onStop () เพื่อ onPause ()

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


การทำแผนที่เป็นลักษณะของมัด
BollMose

2

บันเดิลใช้เพื่อแชร์ข้อมูลระหว่างกิจกรรมและบันทึกสถานะของแอปใน oncreate () วิธีการเพื่อให้แอปรู้ว่ามันหยุดอยู่ที่ใด ... ฉันหวังว่ามันจะช่วย :)


0

การใช้มัดส่งข้อมูลจากกิจกรรมหนึ่งไปยังกิจกรรมอื่นด้วยความช่วยเหลือของวัตถุประสงค์; บันเดิลเก็บข้อมูลที่สามารถเป็นประเภทใดก็ได้

ตอนนี้ฉันบอกว่าวิธีการสร้างชุดข้อมูลการส่งผ่านระหว่างสองกิจกรรม

ขั้นตอนที่ 1: ในกิจกรรมแรก

Bundle b=new Bundle();

b.putString("mkv",anystring);

Intent in=new Intent(getApplicationContext(),secondActivity.class);

in.putExtras(b);

startActivity(in);

ขั้นตอนที่ 2: ในกิจกรรมที่สอง

Intent in=getIntent();

Bundle b=in.getExtras();

String s=b.getString("mkv");

ฉันคิดว่านี่มีประโยชน์สำหรับคุณ ...........


0

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

เช่นข้อความในเครื่องมือหรือเลื่อนตำแหน่งของEditTextListView


0

กิจกรรมแรก:

String food = (String)((Spinner)findViewById(R.id.food)).getSelectedItem();
RadioButton rb = (RadioButton) findViewById(R.id.rb);
Intent i = new Intent(this,secondActivity.class);
i.putExtra("food",food);
i.putExtra("rb",rb.isChecked());

กิจกรรมที่สอง:

String food = getIntent().getExtras().getString("food");
Boolean rb = getIntent().getExtras().getBoolean("rb");

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