Chắc chắn, cách tiếp cận tốt nhất là sử dụng DialogFragment.
Đây là giải pháp của tôi về lớp wrapper giúp ngăn các hộp thoại khác nhau bị loại bỏ trong một Fragment (hoặc Activity có cấu trúc lại nhỏ). Ngoài ra, nó sẽ giúp tránh tái cấu trúc mã lớn nếu vì một số lý do, có rất nhiều AlertDialogs
mã nằm rải rác giữa các mã với sự khác biệt nhỏ giữa chúng về hành động, hình thức hoặc thứ gì đó khác.
public class DialogWrapper extends DialogFragment {
private static final String ARG_DIALOG_ID = "ARG_DIALOG_ID";
private int mDialogId;
/**
* Display dialog fragment.
* @param invoker The fragment which will serve as {@link AlertDialog} alert dialog provider
* @param dialogId The ID of dialog that should be shown
*/
public static <T extends Fragment & DialogProvider> void show(T invoker, int dialogId) {
Bundle args = new Bundle();
args.putInt(ARG_DIALOG_ID, dialogId);
DialogWrapper dialogWrapper = new DialogWrapper();
dialogWrapper.setArguments(args);
dialogWrapper.setTargetFragment(invoker, 0);
dialogWrapper.show(invoker.getActivity().getSupportFragmentManager(), null);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDialogId = getArguments().getInt(ARG_DIALOG_ID);
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return getDialogProvider().getDialog(mDialogId);
}
private DialogProvider getDialogProvider() {
return (DialogProvider) getTargetFragment();
}
public interface DialogProvider {
Dialog getDialog(int dialogId);
}
}
Khi nói đến Hoạt động, bạn có thể gọi getContext()
bên trong onCreateDialog()
, truyền nó tới DialogProvider
giao diện và yêu cầu một hộp thoại cụ thể bằng mDialogId
. Tất cả logic để xử lý một phân đoạn đích phải bị xóa.
Cách sử dụng từ phân mảnh:
public class MainFragment extends Fragment implements DialogWrapper.DialogProvider {
private static final int ID_CONFIRMATION_DIALOG = 0;
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
Button btnHello = (Button) view.findViewById(R.id.btnConfirm);
btnHello.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DialogWrapper.show(MainFragment.this, ID_CONFIRMATION_DIALOG);
}
});
}
@Override
public Dialog getDialog(int dialogId) {
switch (dialogId) {
case ID_CONFIRMATION_DIALOG:
return createConfirmationDialog(); //Your AlertDialog
default:
throw new IllegalArgumentException("Unknown dialog id: " + dialogId);
}
}
}
Bạn có thể đọc toàn bộ bài viết trên blog của tôi Cách ngăn Hộp thoại bị loại bỏ? và chơi với mã nguồn .