확실히 가장 좋은 방법은 DialogFragment를 사용하는 것입니다.
다음은 하나의 프래그먼트 (또는 작은 리팩토링이있는 활동) 내에서 다른 대화 상자가 닫히는 것을 방지하는 데 도움이되는 래퍼 클래스의 내 솔루션입니다. 또한 어떤 이유로 AlertDialogs
코드 사이에 작업, 모양 또는 기타 측면에서 약간의 차이가있는 코드가 많이 흩어져있는 경우 대규모 코드 리팩토링을 피하는 데 도움이됩니다 .
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);
}
}
활동에 관해서는 getContext()
내부 onCreateDialog()
에서 호출 하고 DialogProvider
인터페이스로 캐스트 하고 특정 대화 상자를 요청할 수 mDialogId
있습니다. 대상 조각을 처리하는 모든 논리를 삭제해야합니다.
조각에서 사용 :
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);
}
}
}
내 블로그에서 전체 기사를 읽을 수 있습니다. 대화 상자가 닫히는 것을 방지하는 방법? 그리고 소스 코드를 가지고 놀아 라 .