Có một cách đơn giản hơn nhiều để nhận kết quả từ DialogFragment.
Đầu tiên, trong Activity, Fragment hoặc FragmentActivity của bạn, bạn cần thêm vào thông tin sau:
@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.
}
}
}
Các requestCode
cơ bản là nhãn int của bạn cho DialogFragment bạn gọi, tôi sẽ chỉ cho cách thức hoạt động này trong một giây. Mã kết quả là mã mà bạn gửi lại từ DialogFragment cho biết Hoạt động chờ đợi hiện tại của bạn, Fragment hoặc FragmentActivity đã xảy ra.
Đoạn mã tiếp theo được gọi là cuộc gọi đến DialogFragment. Một ví dụ ở đây:
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");
Với ba dòng này, bạn đang khai báo DialogFragment của mình, đặt requestCode (sẽ gọi onActivityResult (...) sau khi Dialog bị loại bỏ và sau đó bạn sẽ hiển thị hộp thoại. Thật đơn giản.
Bây giờ, trong DialogFragment của bạn, bạn chỉ cần thêm một dòng trực tiếp trước dismiss()
để bạn gửi một kết quả Mã trở lại onActivityResult ().
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, getActivity().getIntent());
dismiss();
Đó là nó. Lưu ý, Mã kết quả được xác định theo cách int resultCode
tôi đã đặt resultCode = 1;
trong trường hợp này.
Thế là xong, giờ đây bạn có thể gửi kết quả DialogFragment của mình trở lại Hoạt động gọi điện thoại, Fragment hoặc FragmentActivity.
Ngoài ra, có vẻ như thông tin này đã được đăng trước đó, nhưng không có một ví dụ đầy đủ nào được đưa ra nên tôi nghĩ tôi sẽ cung cấp thêm chi tiết.
EDIT 06.24.2016
Tôi xin lỗi vì mã sai lệch ở trên. Nhưng bạn chắc chắn không thể nhận được kết quả quay lại hoạt động được xem là dòng:
dialogFrag.setTargetFragment(this, 1);
đặt mục tiêu Fragment
và không Activity
. Vì vậy, để làm điều này, bạn cần sử dụng hiện thực InterfaceCommunicator
.
Trong DialogFragment
tập hợp của bạn một biến toàn cục
public InterfaceCommunicator interfaceCommunicator;
Tạo một chức năng công cộng để xử lý nó
public interface InterfaceCommunicator {
void sendRequestCode(int code);
}
Sau đó, khi bạn đã sẵn sàng để gửi mã trở lại Activity
khi DialogFragment
được thực hiện chạy, bạn chỉ cần thêm dòng trước khi bạn dismiss();
của bạn DialogFragment
:
interfaceCommunicator.sendRequestCode(1); // the parameter is any int code you choose.
Trong hoạt động của bạn bây giờ bạn phải làm hai việc, việc đầu tiên là loại bỏ một dòng mã không còn áp dụng được:
dialogFrag.setTargetFragment(this, 1);
Sau đó thực hiện giao diện và bạn đã hoàn tất. Bạn có thể làm điều đó bằng cách thêm dòng sau vào implements
mệnh đề ở đầu lớp:
public class MyClass Activity implements MyDialogFragment.InterfaceCommunicator
Và sau đó @Override
là chức năng trong hoạt động,
@Override
public void sendRequestCode(int code) {
// your code here
}
Bạn sử dụng phương thức giao diện này giống như onActivityResult()
phương pháp của bạn. Ngoại trừ phương thức giao diện là cho DialogFragments
và khác là cho Fragments
.