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()
, DialogProvider
arayü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 .