Лучший способ обработки диалогов, которые я нашел, - это EventBus. Вы в основном отправляете события из диалогов и перехватываете их в действиях / фрагментах.
Вы можете назначить идентификаторы диалогам после их создания и добавить этот идентификатор в события, чтобы различать события из разных диалогов (даже если диалоги относятся к одному и тому же типу).
Вы можете увидеть, как работает эта схема, и получить дополнительные идеи, просмотрев код здесь . Вы также можете найти этот вспомогательный класс , который я написал полезным (хотя будьте осторожны с ним, потому что этот код очень старый; например, я больше не сохраняю диалоги).
Для полноты ответа я выложу здесь несколько фрагментов. Обратите внимание, что эти фрагменты уже используют новую FragmentFactory, поэтому у диалоговых окон есть аргументы конструктора. Это относительно недавнее дополнение, поэтому ваш код, вероятно, не будет его использовать.
Это может быть реализация диалогового окна, которое показывает некоторую информацию и имеет одну кнопку. Вы хотели бы знать, когда этот диалог закрывается:
public class InfoDialog extends BaseDialog {
public static final String ARG_TITLE = "ARG_TITLE";
public static final String ARG_MESSAGE = "ARG_MESSAGE";
public static final String ARG_BUTTON_CAPTION = "ARG_POSITIVE_BUTTON_CAPTION";
private final EventBus mEventBus;
private TextView mTxtTitle;
private TextView mTxtMessage;
private Button mBtnPositive;
public InfoDialog(EventBus eventBus) {
mEventBus = eventBus;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getContext());
LayoutInflater inflater = LayoutInflater.from(getContext());
View dialogView = inflater.inflate(R.layout.dialog_info_prompt, null);
dialogBuilder.setView(dialogView);
initSubViews(dialogView);
populateSubViews();
setCancelable(true);
return dialogBuilder.create();
}
private void initSubViews(View rootView) {
mTxtTitle = (TextView) rootView.findViewById(R.id.txt_dialog_title);
mTxtMessage = (TextView) rootView.findViewById(R.id.txt_dialog_message);
mBtnPositive = (Button) rootView.findViewById(R.id.btn_dialog_positive);
// Hide "negative" button - it is used only in PromptDialog
rootView.findViewById(R.id.btn_dialog_negative).setVisibility(View.GONE);
mBtnPositive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
}
private void populateSubViews() {
String title = getArguments().getString(ARG_TITLE);
String message = getArguments().getString(ARG_MESSAGE);
String positiveButtonCaption = getArguments().getString(ARG_BUTTON_CAPTION);
mTxtTitle.setText(TextUtils.isEmpty(title) ? "" : title);
mTxtMessage.setText(TextUtils.isEmpty(message) ? "" : message);
mBtnPositive.setText(positiveButtonCaption);
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
mEventBus.post(new InfoDialogDismissedEvent(getDialogTag()));
}
}
И этот диалог предлагает пользователю выбор между двумя вариантами:
public class PromptDialog extends BaseDialog {
public static final String ARG_TITLE = "ARG_TITLE";
public static final String ARG_MESSAGE = "ARG_MESSAGE";
public static final String ARG_POSITIVE_BUTTON_CAPTION = "ARG_POSITIVE_BUTTON_CAPTION";
public static final String ARG_NEGATIVE_BUTTON_CAPTION = "ARG_NEGATIVE_BUTTON_CAPTION";
private final EventBus mEventBus;
private TextView mTxtTitle;
private TextView mTxtMessage;
private Button mBtnPositive;
private Button mBtnNegative;
public PromptDialog(EventBus eventBus) {
mEventBus = eventBus;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getContext());
LayoutInflater inflater = LayoutInflater.from(getContext());
View dialogView = inflater.inflate(R.layout.dialog_info_prompt, null);
dialogBuilder.setView(dialogView);
initSubViews(dialogView);
populateSubViews();
setCancelable(false);
return dialogBuilder.create();
}
private void initSubViews(View rootView) {
mTxtTitle = (TextView) rootView.findViewById(R.id.txt_dialog_title);
mTxtMessage = (TextView) rootView.findViewById(R.id.txt_dialog_message);
mBtnPositive = (Button) rootView.findViewById(R.id.btn_dialog_positive);
mBtnNegative = (Button) rootView.findViewById(R.id.btn_dialog_negative);
mBtnPositive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
mEventBus.post(new PromptDialogDismissedEvent(getDialogTag(), PromptDialogDismissedEvent.BUTTON_POSITIVE));
}
});
mBtnNegative.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
mEventBus.post(new PromptDialogDismissedEvent(getDialogTag(), PromptDialogDismissedEvent.BUTTON_NEGATIVE));
}
});
}
private void populateSubViews() {
String title = getArguments().getString(ARG_TITLE);
String message = getArguments().getString(ARG_MESSAGE);
String positiveButtonCaption = getArguments().getString(ARG_POSITIVE_BUTTON_CAPTION);
String negativeButtonCaption = getArguments().getString(ARG_NEGATIVE_BUTTON_CAPTION);
mTxtTitle.setText(TextUtils.isEmpty(title) ? "" : title);
mTxtMessage.setText(TextUtils.isEmpty(message) ? "" : message);
mBtnPositive.setText(positiveButtonCaption);
mBtnNegative.setText(negativeButtonCaption);
}
@Override
public void onCancel(DialogInterface dialog) {
dismiss();
mEventBus.post(new PromptDialogDismissedEvent(getDialogTag(), PromptDialogDismissedEvent.BUTTON_NONE));
}
}