Kesinlikle, en iyi yaklaşım DialogFragment kullanmaktır.
İşte, farklı diyalogların bir Fragment (veya küçük yeniden düzenleme ile Activity) içinde atılmasını önlemeye yardımcı olan sarmalayıcı sınıfının benim çözümü. Ayrıca, bazı nedenlerden dolayı AlertDialogs, eylemler, görünüm veya başka bir şey açısından aralarında küçük farklılıklar bulunan kod arasında çok fazla dağınıklık varsa, kitlesel kod yeniden düzenlemesinden kaçınmaya yardımcı olur .
public class DialogWrapper extends DialogFragment {
private static final String ARG_DIALOG_ID = "ARG_DIALOG_ID";
private int mDialogId;
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);
}
}
Etkinlik söz konusu olduğunda , getContext()içeriden çağırabilir onCreateDialog(), DialogProviderarayüze aktarabilir ve belirli bir iletişim kutusu talep edebilirsiniz mDialogId. Bir hedef parçayla ilgilenmek için tüm mantık silinmelidir.
Parçadan kullanım:
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();
default:
throw new IllegalArgumentException("Unknown dialog id: " + dialogId);
}
}
}
Yazının tamamını blogumda okuyabilirsiniz Dialog'un kapatılmasını nasıl önleyebilirim? ve kaynak kodla oynayın .