มีวิธีที่ง่ายกว่ามากในการรับผลลัพธ์จาก DialogFragment
ก่อนอื่นในกิจกรรมกิจกรรมส่วนหรือกิจกรรมส่วนคุณต้องเพิ่มข้อมูลต่อไปนี้:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// Stuff to do, dependent on requestCode and resultCode
if(requestCode == 1) { // 1 is an arbitrary number, can be any int
// This is the return result of your DialogFragment
if(resultCode == 1) { // 1 is an arbitrary number, can be any int
// Now do what you need to do after the dialog dismisses.
}
}
}
นี่requestCode
คือป้ายกำกับ int ของคุณสำหรับ DialogFragment ที่คุณเรียกว่าฉันจะแสดงให้เห็นว่ามันใช้งานได้ในไม่กี่วินาที resultCode คือรหัสที่คุณส่งกลับมาจาก DialogFragment เพื่อบอกให้คุณทราบถึงกิจกรรมรอชิ้นส่วนหรือ FragmentActivity ที่กำลังเกิดขึ้น
ส่วนต่อไปของรหัสในการเรียก DialogFragment ตัวอย่างอยู่ที่นี่:
DialogFragment dialogFrag = new MyDialogFragment();
// This is the requestCode that you are sending.
dialogFrag.setTargetFragment(this, 1);
// This is the tag, "dialog" being sent.
dialogFrag.show(getFragmentManager(), "dialog");
ด้วยสามบรรทัดนี้คุณจะประกาศ DialogFragment ของคุณให้ตั้งค่า requestCode (ซึ่งจะเรียกใช้ onActivityResult (... ) เมื่อไดอะล็อกถูกยกเลิกและคุณจะแสดงกล่องโต้ตอบมันง่ายมาก
ตอนนี้ใน DialogFragment ของคุณคุณต้องเพิ่มหนึ่งบรรทัดก่อนหน้าโดยตรงdismiss()
เพื่อที่คุณจะส่ง resultCode กลับไปที่ onActivityResult ()
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, getActivity().getIntent());
dismiss();
แค่นั้นแหละ. หมายเหตุ resultCode ถูกกำหนดตามint resultCode
ที่ฉันได้ตั้งไว้resultCode = 1;
ในกรณีนี้
เพียงเท่านี้คุณก็สามารถส่งผลลัพธ์ของ DialogFragment กลับไปยังกิจกรรมการโทรแฟรกเมนต์หรือแฟรกเมนต์ของคุณได้
นอกจากนี้ดูเหมือนว่าข้อมูลนี้ถูกโพสต์ก่อนหน้านี้ แต่ไม่มีตัวอย่างเพียงพอให้ดังนั้นฉันคิดว่าฉันจะให้รายละเอียดเพิ่มเติม
แก้ไข 06.24.2016
ฉันขอโทษสำหรับรหัสที่ทำให้เข้าใจผิดด้านบน แต่แน่นอนที่สุดคุณไม่สามารถรับผลลัพธ์กลับไปที่กิจกรรมที่เห็นในบรรทัด:
dialogFrag.setTargetFragment(this, 1);
กำหนดเป้าหมายและไม่ได้Fragment
Activity
ดังนั้นในการทำเช่นนี้คุณต้องใช้แอInterfaceCommunicator
ป
ในDialogFragment
ชุดของคุณเป็นตัวแปรทั่วโลก
public InterfaceCommunicator interfaceCommunicator;
สร้างฟังก์ชั่นสาธารณะเพื่อจัดการกับมัน
public interface InterfaceCommunicator {
void sendRequestCode(int code);
}
จากนั้นเมื่อคุณพร้อมที่จะส่งรหัสกลับไปActivity
เมื่อDialogFragment
จะทำทำงานคุณเพียงแค่เพิ่มสายก่อนที่คุณdismiss();
ของคุณDialogFragment
:
interfaceCommunicator.sendRequestCode(1); // the parameter is any int code you choose.
ในกิจกรรมของคุณตอนนี้คุณต้องทำสองสิ่งอย่างแรกคือการลบโค้ดหนึ่งบรรทัดที่ไม่สามารถใช้งานได้อีกต่อไป:
dialogFrag.setTargetFragment(this, 1);
จากนั้นใช้อินเทอร์เฟซและเสร็จสิ้น คุณสามารถทำได้โดยเพิ่มบรรทัดต่อไปนี้ไปยังimplements
ประโยคที่ด้านบนสุดของคลาสของคุณ:
public class MyClass Activity implements MyDialogFragment.InterfaceCommunicator
จากนั้น@Override
ฟังก์ชั่นในกิจกรรม
@Override
public void sendRequestCode(int code) {
// your code here
}
คุณใช้วิธีการอินเทอร์เฟซนี้เหมือนกับonActivityResult()
วิธีที่คุณทำ ยกเว้นวิธีการอินเตอร์เฟซสำหรับการDialogFragments
และอื่น ๆ Fragments
สำหรับ