Jelas, pendekatan terbaik adalah dengan menggunakan DialogFragment.
Berikut adalah solusi saya dari kelas pembungkus yang membantu mencegah dialog berbeda ditutup dalam satu Fragmen (atau Aktivitas dengan pemfaktoran ulang kecil). Selain itu, akan membantu untuk menghindari refactoring kode besar-besaran jika karena alasan tertentu ada banyak AlertDialogs
kode yang tersebar di antara kode dengan sedikit perbedaan di antara mereka dalam hal tindakan, tampilan, atau hal lain.
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);
}
}
Ketika datang ke Aktivitas, Anda bisa memanggil getContext()
di dalam onCreateDialog()
, mentransmisikannya ke DialogProvider
antarmuka dan meminta dialog tertentu mDialogId
. Semua logika untuk menangani fragmen target harus dihapus.
Penggunaan dari fragmen:
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);
}
}
}
Anda dapat membaca artikel lengkap di blog saya Bagaimana cara mencegah Dialog ditutup? dan bermain-main dengan kode sumber .